From: Saif Hakim Date: Fri, 5 Jan 2024 15:38:36 +0000 (-0500) Subject: fix alembic.util.messaging.msg to properly wrap at terminal width X-Git-Tag: rel_1_13_2~18^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=18f51d5176cfd0a9cf53d223e2dbba4ed8af3617;p=thirdparty%2Fsqlalchemy%2Falembic.git fix alembic.util.messaging.msg to properly wrap at terminal width Fixed bug in alembic command stdout where long messages were not properly wrapping at the terminal width. Pull request courtesy Saif Hakim. Fixes: #1384 Closes: #1385 Pull-request: https://github.com/sqlalchemy/alembic/pull/1385 Pull-request-sha: ff59fa59861487cee1943090acc970d9a64f7e96 Change-Id: Ia584d840ca1a9a01e224b92dc4cdcae880ea13aa --- diff --git a/alembic/util/messaging.py b/alembic/util/messaging.py index 5f14d597..6618fa7f 100644 --- a/alembic/util/messaging.py +++ b/alembic/util/messaging.py @@ -95,11 +95,17 @@ def msg( write_outstream(sys.stdout, "\n") else: # left indent output lines - lines = textwrap.wrap(msg, TERMWIDTH) + indent = " " + lines = textwrap.wrap( + msg, + TERMWIDTH, + initial_indent=indent, + subsequent_indent=indent, + ) if len(lines) > 1: for line in lines[0:-1]: - write_outstream(sys.stdout, " ", line, "\n") - write_outstream(sys.stdout, " ", lines[-1], ("\n" if newline else "")) + write_outstream(sys.stdout, line, "\n") + write_outstream(sys.stdout, lines[-1], ("\n" if newline else "")) if flush: sys.stdout.flush() diff --git a/docs/build/unreleased/1384.rst b/docs/build/unreleased/1384.rst new file mode 100644 index 00000000..91e6ea23 --- /dev/null +++ b/docs/build/unreleased/1384.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: bug, commands + :tickets: 1384 + + Fixed bug in alembic command stdout where long messages were not properly + wrapping at the terminal width. Pull request courtesy Saif Hakim. diff --git a/tests/test_command.py b/tests/test_command.py index 48e7af3a..c665f955 100644 --- a/tests/test_command.py +++ b/tests/test_command.py @@ -323,12 +323,6 @@ class CurrentTest(_BufMixin, TestBase): with self._assert_lines(["a3"]): command.current(self.cfg) - def test_current_obfuscate_password(self): - eq_( - util.obfuscate_url_pw("postgresql://scott:tiger@localhost/test"), - "postgresql://scott:***@localhost/test", - ) - def test_two_heads(self): command.stamp(self.cfg, ()) command.stamp(self.cfg, (self.a1.revision, self.b1.revision)) diff --git a/tests/test_messaging.py b/tests/test_messaging.py new file mode 100644 index 00000000..cfd450a2 --- /dev/null +++ b/tests/test_messaging.py @@ -0,0 +1,30 @@ +from io import StringIO + +from alembic.testing import eq_ +from alembic.testing import mock +from alembic.testing.fixtures import TestBase +from alembic.util.messaging import msg +from alembic.util.messaging import obfuscate_url_pw + + +class MessagingTest(TestBase): + def test_msg_wraps(self): + buf = StringIO() + with mock.patch("sys.stdout", buf), mock.patch( + "alembic.util.messaging.TERMWIDTH", 10 + ): + msg("AAAAAAAAAAAAAAAAA") + eq_( + str(buf.getvalue()).splitlines(), + [ + " AAAAAAAA", # initial indent 10 chars before wrapping + " AAAAAAAA", # subsequent indent 10 chars before wrapping + " A", # subsequent indent with remainining chars + ], + ) + + def test_current_obfuscate_password(self): + eq_( + obfuscate_url_pw("postgresql://scott:tiger@localhost/test"), + "postgresql://scott:***@localhost/test", + )