2011-04-03 15 views
6

मैं फ़ाइलों को बदलने के रूप में स्वचालित रूप से घड़ी चलने वाले परीक्षणों को प्राप्त करने का प्रयास कर रहा हूं, और मुझे इस तथ्य को छोड़कर काम करने की ज़रूरत है कि आरएसपीसी के सभी एएनएसआई रंगों को नजरअंदाज कर दिया जा रहा है।रुबी popen3 और एएनएसआई रंग

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

जब cmd rspec spec/**/*.rb की तरह कुछ के बराबर है तो उपरोक्त कोड, सिवाय इसके कि सभी उत्पादन मोनोक्रोम में है RSpec ठीक चलाता है: अपमानजनक कोड इस प्रकार है। मैंने इसके बजाय Kernel.system का उपयोग करने पर ध्यान दिया है, हालांकि सिस्टम उस आउटपुट को वापस नहीं करता है जिसे मुझे यह निर्धारित करने की आवश्यकता है कि कोई परीक्षण विफल/सफल हुआ है या नहीं। मैं आउटपुट को एक स्क्रिप्ट कैसे प्राप्त कर सकता हूं जिसे रूबी के भीतर से एएनएसआई रंग सहित निष्पादित किया गया है और इसे कंसोल पर आउटपुट किया जा सकता है?

उत्तर

6

मुझे लगता है कि आरएसपीईसी उस स्ट्रीम की जांच कर रहा है जिस पर यह आउटपुट लिख रहा है यह देखने के लिए कि यह एक tty (यानी कंसोल) है या नहीं, और यदि यह नहीं है, तो रंग अक्षम करना। कई आदेश यह करते हैं - जीएनयू एलएस और जीआरपी, उदाहरण के लिए। चूंकि बाल प्रक्रिया से आपकी स्क्रिप्ट में स्ट्रीम एक tty नहीं है, रंग अक्षम कर दिया जाएगा।

उम्मीद है कि, आरएसपीईसी में एक ध्वज है जो धारा प्रकार के बावजूद रंग का उपयोग करने के लिए मजबूर करेगा। यदि ऐसा नहीं होता है, तो आपको कुछ सचमुच अजीब stty shenanigans का सहारा लेना होगा।

+1

धन्यवाद टॉम, आपने मुझे सही दिशा में निर्देशित किया और मुझे इसे निम्नानुसार rspec चलाकर काम करना पड़ा: 'rspec --tty --drb --colour [path]' जहां स्पष्ट रूप से [पथ] परीक्षण का मार्ग है) आप दौड़ने के लिए हैं। फिर से धन्यवाद, यह बहुत अच्छा है। –

+0

यह '- सुंदर' तर्क था जो मेरे लिए किया था। –

5

संभावनाएं अच्छी हैं कि rspec उपकरण यह देखने के लिए जांच कर रहा है कि यह टर्मिनल पर इंटरैक्टिव रूप से चल रहा है या रंग आउटपुट का उपयोग करने से पहले स्क्रिप्ट से स्वचालित रूप से चलाया जा रहा है या नहीं।

The documentation कहता है कि आप --color कमांड लाइन विकल्प के साथ रंग को मजबूर कर सकते हैं।

कोशिश करें: rspec --color spec/**/*.rb

+0

क्षमा करें, मुझे यह निर्दिष्ट करना चाहिए था कि वॉकर द्वारा चलाया जा रहा आदेश 'rspec --drb --colour --format nested [file_name_of_test]' है इसलिए रंग मजबूर हो रहा है। –

0

उपयोगकर्ता को टर्मिनल-जैसे व्यवहार का सामना करने वाले उपयोगकर्ता को सुरक्षित रखने के लिए PTY module के माध्यम से छद्म टर्मिनल में कमांड चलाने के लिए संभव है। क्रेडिट tty-command मणि (see this issue) जो अपने मणि में इस व्यवहार को कार्यान्वित के निर्माता पर जाएँ:

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

ध्यान रखें कि एक छद्म टर्मिनल का उपयोग कर इस तरह के कुछ git आदेशों using a pager के रूप में अवांछित दुष्प्रभाव, हो सकता है जो अनिवार्य रूप से होगा आदेशों को लटकने का कारण बनता है। तो कार्यक्षमता शुरू करना एक तोड़ने वाला परिवर्तन हो सकता है।