4 * This file is part of the Behat Testwork.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Testwork\Output;
13 use Behat\Testwork\Output\Exception\FormatterNotFoundException;
14 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
17 * Manages formatters and their configuration.
19 * @author Konstantin Kudryashov <ever.zet@gmail.com>
21 final class OutputManager
24 * @var EventDispatcherInterface
26 private $eventDispatcher;
30 private $formatters = array();
33 * Initializes manager.
35 * @param EventDispatcherInterface $eventDispatcher
37 public function __construct(EventDispatcherInterface $eventDispatcher)
39 $this->eventDispatcher = $eventDispatcher;
43 * Registers formatter.
45 * @param Formatter $formatter
47 public function registerFormatter(Formatter $formatter)
49 if (isset($this->formatters[$formatter->getName()])) {
50 $this->disableFormatter($formatter->getName());
53 $this->formatters[$formatter->getName()] = $formatter;
57 * Checks if formatter is registered.
63 public function isFormatterRegistered($name)
65 return isset($this->formatters[$name]);
69 * Returns formatter by name provided.
75 * @throws FormatterNotFoundException
77 public function getFormatter($name)
79 if (!$this->isFormatterRegistered($name)) {
80 throw new FormatterNotFoundException(sprintf(
81 '`%s` formatter is not found or has not been properly registered. Registered formatters: `%s`.',
83 implode('`, `', array_keys($this->formatters))
87 return $this->formatters[$name];
91 * Returns all registered formatters.
95 public function getFormatters()
97 return $this->formatters;
101 * Enable formatter by name provided.
103 * @param string $formatter
105 public function enableFormatter($formatter)
107 if (!$this->isFormatterRegistered($formatter) && class_exists($formatter)) {
108 $formatterInstance = new $formatter();
109 $formatter = $formatterInstance->getName();
111 if (!$this->isFormatterRegistered($formatter)) {
112 $this->registerFormatter($formatterInstance);
116 $this->eventDispatcher->addSubscriber($this->getFormatter($formatter));
120 * Disable formatter by name provided.
122 * @param string $formatter
124 public function disableFormatter($formatter)
126 $this->eventDispatcher->removeSubscriber($this->getFormatter($formatter));
130 * Disable all registered formatters.
132 public function disableAllFormatters()
134 array_map(array($this, 'disableFormatter'), array_keys($this->formatters));
138 * Sets provided parameter to said formatter.
140 * @param string $formatter
141 * @param string $parameterName
142 * @param mixed $parameterValue
144 public function setFormatterParameter($formatter, $parameterName, $parameterValue)
146 $formatter = $this->getFormatter($formatter);
147 $printer = $formatter->getOutputPrinter();
149 switch ($parameterName) {
150 case 'output_verbosity':
151 $printer->setOutputVerbosity($parameterValue);
155 $printer->setOutputPath($parameterValue);
158 case 'output_decorate':
159 $printer->setOutputDecorated($parameterValue);
162 case 'output_styles':
163 $printer->setOutputStyles($parameterValue);
168 $formatter->setParameter($parameterName, $parameterValue);
172 * Sets provided formatter parameters.
174 * @param string $formatter
175 * @param array $parameters
177 public function setFormatterParameters($formatter, array $parameters)
179 foreach ($parameters as $key => $val) {
180 $this->setFormatterParameter($formatter, $key, $val);
185 * Sets provided parameter to all registered formatters.
187 * @param string $parameterName
188 * @param mixed $parameterValue
190 public function setFormattersParameter($parameterName, $parameterValue)
192 foreach (array_keys($this->formatters) as $formatter) {
193 $this->setFormatterParameter($formatter, $parameterName, $parameterValue);
198 * Sets provided parameters to all registered formatters.
200 * @param array $parameters
202 public function setFormattersParameters(array $parameters)
204 foreach ($parameters as $key => $val) {
205 $this->setFormattersParameter($key, $val);