Рубиновый попен3 и цвет ANSI - PullRequest
6 голосов
/ 03 апреля 2011

Я пытаюсь заставить наблюдателей запускать тесты автоматически при изменении файлов, и получил большую часть того, что мне нужно, за исключением того факта, что все цвета ANSI из RSpec игнорируются.Код неисправности выглядит следующим образом:

stdin, stdout, stderr = Open3.popen3(cmd)
stdout.each_line do |line|
  last_output = line
  puts line
end

Если cmd равен чему-то вроде rspec spec/**/*.rb, то приведенный выше код прекрасно работает с RSpec, за исключением того, что все выходные данные являются монохромными.Я рассмотрел использование Kernel.system вместо этого, однако система не возвращает вывод, который мне нужен, чтобы определить, провалился ли тест или прошел успешно.Как получить выходные данные из скрипта, который выполняется из Ruby, включая цвет ANSI, и вывести его на консоль?

Ответы [ 3 ]

6 голосов
/ 03 апреля 2011

Я бы предположил, что rspec проверяет поток, в который он записывает вывод, чтобы увидеть, является ли он tty (то есть консоль) или нет, и если нет, отключает цвет. Это делают многие команды - например, GNU ls и grep. Поскольку поток из дочернего процесса в ваш скрипт не является tty, цвет будет отключен.

Надеюсь, у rspec есть флаг, который заставляет использовать цвет независимо от типа потока. Если этого не произойдет, вам придется прибегнуть к каким-то действительно странным махинациям.

5 голосов
/ 03 апреля 2011

Скорее всего, инструмент rspec проверяет, работает ли он в интерактивном режиме на терминале или запускается автоматически из сценария, прежде чем принять решение использовать вывод цвета.

В документации говорится, что вы можете принудительно настроить цвет с помощью параметра командной строки --color.

Попробуйте: rspec --color spec/**/*.rb.

0 голосов
/ 26 ноября 2017

Можно запускать команды в псевдотерминале через модуль PTY , чтобы сохранить пользовательское поведение, подобное терминалу.Кредиты предоставляются создателю tty-command gem ( см. Эту проблему ), который реализовал это поведение в своем геме:

require 'tty-command'
cmd = TTY::Command.new(pty: true)
cmd.run('rspec', 'spec/**/*.rb')

Имейте в виду, что припсевдотерминал может иметь нежелательные побочные эффекты, такие как некоторые git команды , использующие пейджер , который по существу приведет к зависанию команд.Таким образом, введение функциональности может быть серьезным изменением.

...