Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Testwork / Cli / Application.php
diff --git a/vendor/behat/behat/src/Behat/Testwork/Cli/Application.php b/vendor/behat/behat/src/Behat/Testwork/Cli/Application.php
new file mode 100644 (file)
index 0000000..4189224
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+
+/*
+ * This file is part of the Behat Testwork.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Testwork\Cli;
+
+use Behat\Testwork\ServiceContainer\Configuration\ConfigurationLoader;
+use Behat\Testwork\ServiceContainer\ContainerLoader;
+use Behat\Testwork\ServiceContainer\Exception\ConfigurationLoadingException;
+use Behat\Testwork\ServiceContainer\ExtensionManager;
+use Symfony\Component\Console\Application as BaseApplication;
+use Symfony\Component\Console\Command\Command as SymfonyCommand;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Extends Symfony console application with testwork functionality.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class Application extends BaseApplication
+{
+    /**
+     * @var ConfigurationLoader
+     */
+    private $configurationLoader;
+    /**
+     * @var ExtensionManager
+     */
+    private $extensionManager;
+
+    /**
+     * Initializes application.
+     *
+     * @param string              $name
+     * @param string              $version
+     * @param ConfigurationLoader $configLoader
+     * @param ExtensionManager    $extensionManager
+     */
+    public function __construct($name, $version, ConfigurationLoader $configLoader, ExtensionManager $extensionManager)
+    {
+        putenv('COLUMNS=9999');
+
+        $this->configurationLoader = $configLoader;
+        $this->extensionManager = $extensionManager;
+
+        parent::__construct($name, $version);
+    }
+
+    /**
+     * Gets the default input definition.
+     *
+     * @return InputDefinition An InputDefinition instance
+     */
+    public function getDefaultInputDefinition()
+    {
+        return new InputDefinition(array(
+            new InputOption('--profile', '-p', InputOption::VALUE_REQUIRED, 'Specify config profile to use.'),
+            new InputOption('--config', '-c', InputOption::VALUE_REQUIRED, 'Specify config file to use.'),
+            new InputOption(
+                '--verbose', '-v', InputOption::VALUE_OPTIONAL,
+                'Increase verbosity of exceptions.' . PHP_EOL .
+                'Use -vv or --verbose=2 to display backtraces in addition to exceptions.'
+            ),
+            new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message.'),
+            new InputOption('--config-reference', null, InputOption::VALUE_NONE, 'Display the configuration reference.'),
+            new InputOption('--debug', null, InputOption::VALUE_NONE, 'Provide debugging information about current environment.'),
+            new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display version.'),
+            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'),
+            new InputOption(
+                '--colors', null, InputOption::VALUE_NONE,
+                'Force ANSI color in the output. By default color support is' . PHP_EOL .
+                'guessed based on your platform and the output if not specified.'
+            ),
+            new InputOption('--no-colors', null, InputOption::VALUE_NONE, 'Force no ANSI color in the output.'),
+        ));
+    }
+
+    /**
+     * Runs the current application.
+     *
+     * @param InputInterface  $input  An Input instance
+     * @param OutputInterface $output An Output instance
+     *
+     * @return integer 0 if everything went fine, or an error code
+     */
+    public function doRun(InputInterface $input, OutputInterface $output)
+    {
+        // xdebug's default nesting level of 100 is not enough
+        if (extension_loaded('xdebug')
+            && false === strpos(ini_get('disable_functions'), 'ini_set')
+        ) {
+            $oldValue = ini_get('xdebug.max_nesting_level');
+            if ($oldValue === false || $oldValue < 256) {
+                ini_set('xdebug.max_nesting_level', 256);
+            }
+        }
+
+        if ($input->hasParameterOption(array('--config-reference'))) {
+            $input = new ArrayInput(array('--config-reference' => true));
+        }
+
+        if ($path = $input->getParameterOption(array('--config', '-c'))) {
+            if (!is_file($path)) {
+                throw new ConfigurationLoadingException("The requested config file does not exist");
+            }
+
+            $this->configurationLoader->setConfigurationFilePath($path);
+        }
+
+        $this->add($this->createCommand($input, $output));
+
+        return parent::doRun($input, $output);
+    }
+
+    protected function getDefaultCommands()
+    {
+        $commands = parent::getDefaultCommands();
+
+        $commands[] = new DumpReferenceCommand($this->extensionManager);
+        $commands[] = new DebugCommand($this, $this->configurationLoader, $this->extensionManager);
+
+        return $commands;
+    }
+
+    /**
+     * Configures container based on provided config file and profile.
+     *
+     * @param InputInterface $input
+     *
+     * @return array
+     */
+    private function loadConfiguration(InputInterface $input)
+    {
+        $profile = $input->getParameterOption(array('--profile', '-p')) ? : 'default';
+
+        return $this->configurationLoader->loadConfiguration($profile);
+    }
+
+    /**
+     * Creates main command for application.
+     *
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     *
+     * @return SymfonyCommand
+     */
+    private function createCommand(InputInterface $input, OutputInterface $output)
+    {
+        return $this->createContainer($input, $output)->get('cli.command');
+    }
+
+    /**
+     * Creates container instance, loads extensions and freezes it.
+     *
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     *
+     * @return ContainerInterface
+     */
+    private function createContainer(InputInterface $input, OutputInterface $output)
+    {
+        $basePath = rtrim($this->getBasePath(), DIRECTORY_SEPARATOR);
+
+        $container = new ContainerBuilder();
+
+        $container->setParameter('cli.command.name', $this->getName());
+        $container->setParameter('paths.base', $basePath);
+
+        $container->set('cli.input', $input);
+        $container->set('cli.output', $output);
+
+        $extension = new ContainerLoader($this->extensionManager);
+        $extension->load($container, $this->loadConfiguration($input));
+        $container->addObjectResource($extension);
+        $container->compile(true);
+
+        return $container;
+    }
+
+    /**
+     * Returns base path.
+     *
+     * @return string
+     */
+    private function getBasePath()
+    {
+        if ($configPath = $this->configurationLoader->getConfigurationFilePath()) {
+            return realpath(dirname($configPath));
+        }
+
+        return realpath(getcwd());
+    }
+
+    /**
+     * Gets the name of the command based on input.
+     *
+     * @param InputInterface $input The input interface
+     *
+     * @return string The command name
+     */
+    protected function getCommandName(InputInterface $input)
+    {
+        if ($input->hasParameterOption(array('--config-reference'))) {
+            return 'dump-reference';
+        }
+
+        if ($input->hasParameterOption(array('--debug'))) {
+            return 'debug';
+        }
+
+        return $this->getName();
+    }
+
+    protected function configureIO(InputInterface $input, OutputInterface $output)
+    {
+        if (true === $input->hasParameterOption(array('--colors'))) {
+            $output->setDecorated(true);
+        } elseif (true === $input->hasParameterOption(array('--no-colors'))) {
+            $output->setDecorated(false);
+        }
+
+        parent::configureIO($input, $output);
+    }
+}