Skip to content

Commit 04c41cf

Browse files
author
Thomas Smith
authored
Fixed indentation for print (#48)
Fix the indentation problem once and for all while adding/improving tests.
1 parent fdc2c6c commit 04c41cf

File tree

2 files changed

+74
-15
lines changed

2 files changed

+74
-15
lines changed

st3/sublime_lib/view_stream.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ def guard_read_only(self):
4545
else:
4646
yield
4747

48+
@define_guard
49+
@contextmanager
50+
def guard_auto_indent(self):
51+
settings = self.view.settings()
52+
if settings.get('auto_indent'):
53+
settings.set('auto_indent', False)
54+
yield
55+
settings.set('auto_indent', True)
56+
else:
57+
yield
58+
4859
@define_guard
4960
def guard_validity(self):
5061
if not self.view.is_valid():
@@ -95,25 +106,23 @@ def _read(self, begin, end, size):
95106
@guard_validity
96107
@guard_selection
97108
@guard_read_only
109+
@guard_auto_indent
98110
def write(self, s):
99111
"""Insert the string `s` into the view and return the number of
100112
characters inserted. The string will be inserted immediately before the
101-
cursor.
113+
cursor. It will not be auto-indented.
102114
103115
Note: Because Sublime may convert tabs to spaces, the number of
104116
characters inserted may not match the length of the argument.
105117
"""
106-
# This is a hack to get around auto-indentation.
107118
old_size = self.view.size()
108-
self.view.run_command('insert_snippet', {
109-
'contents': '$sublime_lib__insert_text',
110-
'sublime_lib__insert_text': s,
111-
})
119+
self.view.run_command('insert', {'characters': s})
112120
return self.view.size() - old_size
113121

114-
def print(self, *objects, **kwargs):
115-
"""Shorthand for ``print(*objects, file=self, **kwargs)``."""
116-
print(*objects, file=self, **kwargs)
122+
def print(self, *objects, sep=' ', end='\n'):
123+
"""Shorthand for :func:`print()` passing this ViewStream as the `file`
124+
argument."""
125+
print(*objects, file=self, sep=sep, end=end)
117126

118127
def flush(self):
119128
"""Do nothing. (The stream is not buffered.)"""

tests/test_view_stream.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from sublime_lib import ViewStream
33

44
from unittest import TestCase
5-
from io import UnsupportedOperation
5+
from io import UnsupportedOperation, StringIO
66

77

88
class TestViewStream(TestCase):
@@ -48,11 +48,12 @@ def test_write_size(self):
4848
self.assertEqual(size, self.stream.view.size())
4949

5050
def test_no_indent(self):
51-
text = "Hello\n World\n!"
51+
text = " "
5252

5353
self.stream.view.settings().set('auto_indent', True)
5454
self.stream.write(text)
55-
self.assertContents(text)
55+
self.stream.write("\n")
56+
self.assertContents(text + "\n")
5657

5758
def test_clear(self):
5859
self.stream.write("Some text")
@@ -109,17 +110,66 @@ def test_readline(self):
109110
self.assertEqual(text, "World")
110111
self.assertEqual(self.stream.tell(), 12)
111112

112-
def test_write_only(self):
113+
def test_write_read_only_failure(self):
113114
self.stream.view.set_read_only(True)
114115

115116
self.assertRaises(ValueError, self.stream.write, 'foo')
116117
self.assertRaises(ValueError, self.stream.clear)
117118

119+
def test_write_read_only_success(self):
120+
self.stream.view.set_read_only(True)
118121
self.stream.force_writes = True
119-
self.assertEqual(self.stream.write('foo'), 3)
122+
123+
self.stream.write('foo')
124+
self.assertContents('foo')
125+
126+
self.stream.clear()
127+
self.assertContents('')
128+
129+
def _compare_print(self, *args, **kwargs):
130+
s = StringIO()
131+
print(*args, file=s, **kwargs)
132+
133+
self.stream.clear()
134+
self.stream.print(*args, **kwargs)
135+
136+
self.assertContents(s.getvalue())
137+
138+
self.stream.clear()
139+
print(*args, file=self.stream, **kwargs)
140+
141+
self.assertContents(s.getvalue())
142+
143+
def test_print(self):
144+
text = "Hello, World!"
145+
number = 42
146+
147+
self._compare_print(text, number)
148+
self._compare_print(text, number, sep=',', end=';')
149+
self._compare_print(text, number, sep='', end='')
150+
151+
def test_print_no_indent(self):
152+
text = " "
153+
154+
self.stream.view.settings().set('auto_indent', True)
155+
self.stream.print(text)
156+
self.assertContents(text + "\n")
157+
158+
def test_print_read_only_failure(self):
159+
self.stream.view.set_read_only(True)
160+
161+
self.assertRaises(ValueError, self.stream.print, 'foo')
162+
self.assertRaises(ValueError, self.stream.clear)
163+
164+
def test_print_read_only_success(self):
165+
self.stream.view.set_read_only(True)
166+
self.stream.force_writes = True
167+
168+
self.stream.print('foo')
169+
self.assertContents("foo\n")
120170

121171
self.stream.clear()
122-
self.assertEqual(self.stream.view.size(), 0)
172+
self.assertContents('')
123173

124174
def test_unsupported(self):
125175
self.assertRaises(UnsupportedOperation, self.stream.detach)

0 commit comments

Comments
 (0)