6 Stimmen

Ruby popen3 und ANSI-Farbe

Ich versuche, watchr laufen Tests automatisch als Dateien ändern, und bekam das meiste, was ich brauche arbeiten, außer für die Tatsache, dass alle ANSI-Farben von RSpec ignoriert werden. Der beanstandete Code ist wie folgt:

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

Wenn cmd gleich etwas ist wie rspec spec/**/*.rb dann läuft der obige Code RSpec gut, außer, dass alle Ausgaben in monochrom sind. Ich habe mir die Verwendung von Kernel.system stattdessen gibt das System jedoch nicht die Ausgabe zurück, die ich benötige, um festzustellen, ob ein Test fehlgeschlagen oder erfolgreich war. Wie kann ich die Ausgabe von einem Skript erhalten, das von Ruby aus ausgeführt wird, einschließlich der ANSI-Farbe, und diese auf der Konsole ausgeben?

6voto

Tom Anderson Punkte 44661

Ich würde vermuten, dass rspec den Stream, in den es die Ausgabe schreibt, daraufhin untersucht, ob es sich um ein tty (d.h. die Konsole) handelt oder nicht, und wenn nicht, die Farbe deaktiviert. Viele Befehle tun dies - GNU ls und grep, zum Beispiel. Da der Stream vom Kindprozess zu Ihrem Skript kein tty ist, wird die Farbe deaktiviert.

Hoffentlich hat rspec ein Flag, das die Verwendung von Farbe unabhängig vom Streamtyp erzwingt. Wenn nicht, müssen Sie auf einige wirklich seltsame stty Blödsinn zurückgreifen.

5voto

sarnold Punkte 99402

Die Chancen sind gut, dass die rspec Tool prüft, ob es interaktiv auf einem Terminal läuft oder automatisch von einem Skript ausgeführt wird, bevor es entscheidet, ob es eine Farbausgabe verwendet oder nicht.

Die Dokumentation sagt, dass man Farbe erzwingen kann mit --color Befehlszeilenoption.

Versuchen Sie es: rspec --color spec/**/*.rb .

2voto

thisismydesign Punkte 14173

Es ist möglich, Befehle in einem Pseudoterminal über die PTY-Modul um ein benutzerorientiertes, terminalähnliches Verhalten zu erhalten. Der Dank geht an den Ersteller des tty-Befehl gem ( siehe diese Ausgabe ), der dieses Verhalten in seinen Edelstein implementiert hat:

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

Denken Sie daran, dass die Verwendung eines Pseudo-Terminals unerwünschte Nebenwirkungen haben kann, wie z. B. bestimmte git Befehle Verwendung eines Pagers was im Wesentlichen dazu führt, dass die Befehle hängen bleiben. Die Einführung dieser Funktion könnte also eine einschneidende Änderung darstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X