Skip to content

Commit 75b4a0f

Browse files
1 parent 3cbe24d commit 75b4a0f

File tree

6 files changed

+37
-11
lines changed

6 files changed

+37
-11
lines changed

bpython/curtsiesfrontend/preprocess.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88

99
indent_empty_lines_re = LazyReCompile(r'\s*')
10+
tabs_to_spaces_re = LazyReCompile(r'^\t+')
1011

1112

1213
def indent_empty_lines(s, compiler):
@@ -30,3 +31,16 @@ def indent_empty_lines(s, compiler):
3031
result_lines.append(line)
3132

3233
return '\n'.join(result_lines) + ('\n' if ends_with_newline else '')
34+
35+
36+
def leading_tabs_to_spaces(s):
37+
lines = s.split('\n')
38+
result_lines = []
39+
tab_to_space = lambda m: len(m.group()) * 4 * ' '
40+
for line in lines:
41+
result_lines.append(tabs_to_spaces_re.sub(tab_to_space, line))
42+
return '\n'.join(result_lines)
43+
44+
45+
def preprocess(s, compiler):
46+
return indent_empty_lines(leading_tabs_to_spaces(s), compiler)

bpython/curtsiesfrontend/repl.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
from bpython.curtsiesfrontend import events as bpythonevents
4747
from bpython.curtsiesfrontend.parse import parse as bpythonparse
4848
from bpython.curtsiesfrontend.parse import func_for_letter, color_for_letter
49-
from bpython.curtsiesfrontend.preprocess import indent_empty_lines
49+
from bpython.curtsiesfrontend.preprocess import preprocess
5050
from bpython.curtsiesfrontend.interpreter import Interp, \
5151
code_finished_will_parse
5252

@@ -463,8 +463,8 @@ def process_control_event(self, e):
463463
if ctrl_char is not None:
464464
return self.process_event(ctrl_char)
465465
simple_events = just_simple_events(e.events)
466-
source = indent_empty_lines(''.join(simple_events),
467-
self.interp.compile)
466+
source = preprocess(''.join(simple_events),
467+
self.interp.compile)
468468

469469
with self.in_paste_mode():
470470
for ee in source:
@@ -740,7 +740,7 @@ def send_session_to_external_editor(self, filename=None):
740740
text = self.send_to_external_editor(for_editor)
741741
lines = text.split('\n')
742742
from_editor = [line for line in lines if line[:4] != '### ']
743-
source = indent_empty_lines('\n'.join(from_editor), self.interp.compile)
743+
source = preprocess('\n'.join(from_editor), self.interp.compile)
744744
self.history = source.split('\n')
745745
self.reevaluate(insert_into_history=True)
746746
self.current_line = lines[-1][4:]

bpython/lazyre.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,7 @@ def search(self, *args, **kwargs):
4848
@compile_regex
4949
def match(self, *args, **kwargs):
5050
return self.compiled.match(*args, **kwargs)
51+
52+
@compile_regex
53+
def sub(self, *args, **kwargs):
54+
return self.compiled.sub(*args, **kwargs)

bpython/test/fodder/original.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,5 @@ def foo():
4545

4646
#EndTest
4747

48+
def tabs():
49+
return 1

bpython/test/fodder/processed.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,6 @@ def foo():
4343
return 1
4444

4545
#EndTest
46+
47+
def tabs():
48+
return 1

bpython/test/test_preprocess.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
skip = unittest.skip
1212

1313
from bpython.curtsiesfrontend.interpreter import code_finished_will_parse
14-
from bpython.curtsiesfrontend.preprocess import indent_empty_lines
14+
from bpython.curtsiesfrontend.preprocess import preprocess
1515

1616
from bpython.test.fodder import original as original, processed
1717

18-
indent_empty = partial(indent_empty_lines, compiler=compiler)
18+
preproc = partial(preprocess, compiler=compiler)
1919

2020

2121
def get_fodder_source(test_name):
@@ -39,9 +39,9 @@ def assertCompiles(self, source):
3939
return finished and parsable
4040

4141
def test_indent_empty_lines_nops(self):
42-
self.assertEqual(indent_empty('hello'), 'hello')
43-
self.assertEqual(indent_empty('hello\ngoodbye'), 'hello\ngoodbye')
44-
self.assertEqual(indent_empty('a\n b\nc\n'), 'a\n b\nc\n')
42+
self.assertEqual(preproc('hello'), 'hello')
43+
self.assertEqual(preproc('hello\ngoodbye'), 'hello\ngoodbye')
44+
self.assertEqual(preproc('a\n b\nc\n'), 'a\n b\nc\n')
4545

4646
def assertShowWhitespaceEqual(self, a, b):
4747
self.assertEqual(
@@ -57,12 +57,12 @@ def assertDefinitionIndented(self, obj):
5757
obj2 = getattr(processed, name)
5858
orig = inspect.getsource(obj)
5959
xformed = inspect.getsource(obj2)
60-
self.assertShowWhitespaceEqual(indent_empty(orig), xformed)
60+
self.assertShowWhitespaceEqual(preproc(orig), xformed)
6161
self.assertCompiles(xformed)
6262

6363
def assertLinesIndented(self, test_name):
6464
orig, xformed = get_fodder_source(test_name)
65-
self.assertShowWhitespaceEqual(indent_empty(orig), xformed)
65+
self.assertShowWhitespaceEqual(preproc(orig), xformed)
6666
self.assertCompiles(xformed)
6767

6868
def assertIndented(self, obj_or_name):
@@ -92,3 +92,6 @@ def test_blank_line_in_try_catch_else(self):
9292

9393
def test_blank_trailing_line(self):
9494
self.assertIndented('blank_trailing_line')
95+
96+
def test_tabs(self):
97+
self.assertIndented(original.tabs)

0 commit comments

Comments
 (0)