#24068: management commands' OutputWrapper adds newline wrapped inside style
-------------------------------------+-------------------------------------
     Reporter:  MarkusH              |                    Owner:  MarkusH
         Type:  Bug                  |                   Status:  assigned
    Component:  Core (Management     |                  Version:  master
  commands)                          |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  1                    |  Patch needs improvement:  0
Easy pickings:  1                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by MarkusH:

Old description:

> According to the [https://docs.djangoproject.com/en/dev/howto/custom-
> management-commands/#management-commands-output docs] the
> `self.stdout.write()` adds a newline (or explicitly defined ending) add
> the end of the message, if it's not already there. However, if the output
> is wrapped in some kind of style the message, including the ending, is
> wrapped.
>
> Instead of
> {{{
> '\x1b[31;1mHello, world!\x1b[0m\n'
> }}}
> one gets
> {{{
> '\x1b[31;1mHello, world!\n\x1b[0m'
> }}}
>
> The issue came up while investigating
> https://github.com/django/django/pull/3153#issuecomment-68471839
>
> A potential patch would be:
>
> {{{#!diff
> diff --git a/django/core/management/base.py
> b/django/core/management/base.py
> index 869a11b..dc22d74 100644
> --- a/django/core/management/base.py
> +++ b/django/core/management/base.py
> @@ -107,11 +107,13 @@ class OutputWrapper(object):
>          return getattr(self._out, name)
>
>      def write(self, msg, style_func=None, ending=None):
> -        ending = self.ending if ending is None else ending
> -        if ending and not msg.endswith(ending):
> -            msg += ending
>          style_func = style_func or self.style_func
> -        self._out.write(force_str(style_func(msg)))
> +        ending = self.ending if ending is None else ending
> +        if ending:
> +            if msg.endswith(ending):
> +                msg = msg[:-len(ending)]
> +        msg = force_str(style_func(msg)) + ending
> +        self._out.write(msg)
>

>  class BaseCommand(object):
> }}}

New description:

 According to the [https://docs.djangoproject.com/en/dev/howto/custom-
 management-commands/#management-commands-output docs] the
 `self.stdout.write()` adds a newline (or explicitly defined ending) add
 the end of the message, if it's not already there. However, if the output
 is wrapped in some kind of style the message, including the ending, is
 wrapped.

 Instead of
 {{{
 '\x1b[31;1mHello, world!\x1b[0m\n'
 }}}
 one gets
 {{{
 '\x1b[31;1mHello, world!\n\x1b[0m'
 }}}

 The issue came up while investigating
 https://github.com/django/django/pull/3153#issuecomment-68471839

 A potential patch would be:

 {{{#!diff
 diff --git a/django/core/management/base.py
 b/django/core/management/base.py
 index 869a11b..318740f 100644
 --- a/django/core/management/base.py
 +++ b/django/core/management/base.py
 @@ -107,11 +107,12 @@ class OutputWrapper(object):
          return getattr(self._out, name)

      def write(self, msg, style_func=None, ending=None):
 -        ending = self.ending if ending is None else ending
 -        if ending and not msg.endswith(ending):
 -            msg += ending
          style_func = style_func or self.style_func
 -        self._out.write(force_str(style_func(msg)))
 +        ending = self.ending if ending is None else ending
 +        if ending and msg.endswith(ending):
 +            msg = msg[:-len(ending)]
 +        msg = force_str(style_func(msg)) + ending
 +        self._out.write(msg)
 }}}

--

--
Ticket URL: <https://code.djangoproject.com/ticket/24068#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.306ef488ab0e9adf67e645603c1ac0ba%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to