diff --git a/composer.json b/composer.json index 603cd1f..8165b17 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,10 @@ "require": { "php": ">=5.3", "symfony/yaml": "~2.3", - "symfony/dependency-injection": "~2.3" + "symfony/dependency-injection": "~2.3", + "symfony/console": "~2.3" }, "require-dev": { - "symfony/console": "~2.7", "twig/twig": "~1.22", "fabpot/php-cs-fixer": "~1.9", "satooshi/php-coveralls": "~0.6", diff --git a/src/ConfigBridge.php b/src/ConfigBridge.php index f96609b..f0b5630 100644 --- a/src/ConfigBridge.php +++ b/src/ConfigBridge.php @@ -6,12 +6,16 @@ use SLLH\StyleCIBridge\Exception\LevelConfigException; use SLLH\StyleCIBridge\Exception\PresetConfigException; use SLLH\StyleCIBridge\StyleCI\Fixers; +use Symfony\Component\Console\Formatter\OutputFormatterStyle; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\Finder\Finder; use Symfony\Component\Yaml\Yaml; use Symfony\CS\Config\Config; use Symfony\CS\Finder\DefaultFinder; use Symfony\CS\Fixer\Contrib\HeaderCommentFixer; +use Symfony\CS\FixerFactory; use Symfony\CS\FixerInterface; /** @@ -19,6 +23,16 @@ */ final class ConfigBridge { + /** + * @var OutputInterface + */ + private $output; + + /** + * @var FixerInterface[]|null + */ + private $availableFixers = null; + /** * @var string */ @@ -42,7 +56,10 @@ public function __construct($styleCIConfigDir = null, $finderDirs = null) { $this->styleCIConfigDir = null !== $styleCIConfigDir ? $styleCIConfigDir : getcwd(); $this->finderDirs = null !== $finderDirs ? $finderDirs : getcwd(); + $this->output = new ConsoleOutput(); + $this->output->getFormatter()->setStyle('warning', new OutputFormatterStyle('black', 'yellow')); + $this->loadAvailableFixers(); $this->parseStyleCIConfig(); } @@ -166,9 +183,17 @@ public function getRules() $rules = array(); foreach ($fixers as $fixer) { if ('-' === $fixer[0]) { - $rules[substr($fixer, 1)] = false; + $name = substr($fixer, 1); + $enabled = false; } else { - $rules[$fixer] = true; + $name = $fixer; + $enabled = true; + } + + if ($this->isFixerAvailable($name)) { + $rules[$name] = $enabled; + } else { + $this->output->writeln(sprintf('Fixer "%s" does not exist, skipping.', $name)); } } @@ -210,10 +235,10 @@ private function getPresetFixers() private function resolveAliases(array $fixers) { foreach (Fixers::$aliases as $alias => $name) { - if (in_array($alias, $fixers, true) && !in_array($name, $fixers, true)) { + if (in_array($alias, $fixers, true) && !in_array($name, $fixers, true) && $this->isFixerAvailable($name)) { array_push($fixers, $name); } - if (in_array($name, $fixers, true) && !in_array($alias, $fixers, true)) { + if (in_array($name, $fixers, true) && !in_array($alias, $fixers, true) && $this->isFixerAvailable($alias)) { array_push($fixers, $alias); } } @@ -221,6 +246,40 @@ private function resolveAliases(array $fixers) return $fixers; } + /** + * @param string $name + * + * @return bool + */ + private function isFixerAvailable($name) + { + // PHP-CS-Fixer 1.x BC + if (null === $this->availableFixers) { + return true; + } + + return isset($this->availableFixers[$name]); + } + + /** + * Can be replaced by Config::getFixersByName if following PR is accepted. + * + * @link https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/1429 + */ + private function loadAvailableFixers() + { + // Remove rules that not exists + if (class_exists('Symfony\CS\FixerFactory')) { // PHP-CS-Fixer 1.x BC + $fixerFactory = FixerFactory::create(); + $fixerFactory->registerBuiltInFixers(); + + $this->availableFixers = array(); + foreach ($fixerFactory->getFixers() as $fixer) { + $this->availableFixers[$fixer->getName()] = $fixer; + } + } + } + private function parseStyleCIConfig() { if (null === $this->styleCIConfig) {