class ShotRunnerController(QtCore.QThread):
    def __init__(self, scripts, settingsFiles, logWindow):
        QtCore.QThread.__init__(self)
        self.scripts = scripts
        self.settingsFiles = settingsFiles
        self.logWindow = logWindow
        self.scriptRunner = None

    def run(self):
        for script, settingsFile in zip(self.scripts, self.settingsFiles):
            self.scriptRunner = ScriptRunner(script)
            scriptDir = os.path.dirname(script)
            #shutil.copyfile(settingsFile, os.path.join(scriptDir, AutoConfigLoader.SETTINGS_FILE_NAME))
            shutil.copyfile(settingsFile, AutoConfigLoader.SETTINGS_FILE_NAME)

            signal = StringSignal()
            signal.get().connect(self.logWindow.appendMessage)

            outputReader = StandardOutputReader(self.scriptRunner, signal)
            errorReader = StandardErrorReader(self.scriptRunner, signal)

            self.scriptRunner.executeAsync()

            outputReader.start()
            errorReader.start()

            self.scriptRunner.wait()
            outputReader.wait()
            errorReader.wait()

    def terminate(self):
        if self.scriptRunner:
            self.scriptRunner.process.terminate()
        QtCore.QThread.terminate(self)
 def test_executeCapturesStderr(self):
     script = "raise Exception('foo')"
     with open(self.tempFile, 'w') as f:
         f.write(script)
     runner = ScriptRunner(self.tempFile)
     _, err = runner.execute()
     self.assertTrue('Exception: foo' in err)
 def test_executeCapturesStdout(self):
     script = "print 'Foobar'"
     with open(self.tempFile, 'w') as f:
         f.write(script)
     runner = ScriptRunner(self.tempFile)
     out, _ = runner.execute()
     self.assertEqual('Foobar\n', out)
 def test_canExecuteAsync(self):
     script = "print 'Foobar'"
     with open(self.tempFile, 'w') as f:
         f.write(script)
     runner = ScriptRunner(self.tempFile)
     runner.executeAsync()
     out, _ = runner.join()
     self.assertEqual('Foobar\n', out)
 def test_canGetErrorStream(self):
     script = "raise Exception('foo')"
     with open(self.tempFile, 'w') as f:
         f.write(script)
     runner = ScriptRunner(self.tempFile)
     runner.executeAsync()
     self.assertTrue(any('Exception: foo' in line for line in runner.errorStream()))
     runner.join()
 def test_canGetOutputStream(self):
     script = "print 'Foobar'"
     with open(self.tempFile, 'w') as f:
         f.write(script)
     runner = ScriptRunner(self.tempFile)
     runner.executeAsync()
     out = runner.outputStream().next()
     self.assertEqual('Foobar\n', out)
     runner.join()
    def run(self):
        for script, settingsFile in zip(self.scripts, self.settingsFiles):
            self.scriptRunner = ScriptRunner(script)
            scriptDir = os.path.dirname(script)
            #shutil.copyfile(settingsFile, os.path.join(scriptDir, AutoConfigLoader.SETTINGS_FILE_NAME))
            shutil.copyfile(settingsFile, AutoConfigLoader.SETTINGS_FILE_NAME)

            signal = StringSignal()
            signal.get().connect(self.logWindow.appendMessage)

            outputReader = StandardOutputReader(self.scriptRunner, signal)
            errorReader = StandardErrorReader(self.scriptRunner, signal)

            self.scriptRunner.executeAsync()

            outputReader.start()
            errorReader.start()

            self.scriptRunner.wait()
            outputReader.wait()
            errorReader.wait()