From f1f24539d8c86f60d1e2951a19eb3178e15d6399 Mon Sep 17 00:00:00 2001 From: Thomas Riccardi Date: Thu, 8 Oct 2020 20:41:22 +0200 Subject: [PATCH] Fixed #32094 -- Fixed flush() calls on management command self.stdout/err proxies. --- django/core/management/base.py | 4 ++++ tests/user_commands/management/commands/outputwrapper.py | 8 ++++++++ tests/user_commands/tests.py | 7 +++++++ 3 files changed, 19 insertions(+) create mode 100644 tests/user_commands/management/commands/outputwrapper.py diff --git a/django/core/management/base.py b/django/core/management/base.py index e6cbf8c64f..463e4e8665 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -140,6 +140,10 @@ class OutputWrapper(TextIOBase): def __getattr__(self, name): return getattr(self._out, name) + def flush(self): + if hasattr(self._out, 'flush'): + self._out.flush() + def isatty(self): return hasattr(self._out, 'isatty') and self._out.isatty() diff --git a/tests/user_commands/management/commands/outputwrapper.py b/tests/user_commands/management/commands/outputwrapper.py new file mode 100644 index 0000000000..bafc30d128 --- /dev/null +++ b/tests/user_commands/management/commands/outputwrapper.py @@ -0,0 +1,8 @@ +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + def handle(self, **options): + self.stdout.write('Working...') + self.stdout.flush() + self.stdout.write('OK') diff --git a/tests/user_commands/tests.py b/tests/user_commands/tests.py index e4aeca2600..eb2d38fbfb 100644 --- a/tests/user_commands/tests.py +++ b/tests/user_commands/tests.py @@ -341,6 +341,13 @@ class CommandTests(SimpleTestCase): parser = BaseCommand().create_parser('prog_name', 'subcommand', epilog=epilog) self.assertEqual(parser.epilog, epilog) + def test_outputwrapper_flush(self): + out = StringIO() + with mock.patch.object(out, 'flush') as mocked_flush: + management.call_command('outputwrapper', stdout=out) + self.assertIn('Working...', out.getvalue()) + self.assertIs(mocked_flush.called, True) + class CommandRunTests(AdminScriptTestCase): """