示例#1
0
 /**
  * Compare generated class with expected class into resource dir
  *
  * @param string         $resourcesDir     fullPath resources dir
  * @param string         $namespace        namespace of class
  * @param string         $className        class name
  * @param string         $directoryOutput  output directory to compare from
  * @param bool           $createIfNotExist generate file if not exist equals on genereted one
  */
 private function compareClassPhp($resourcesDir, $namespace, $className, $directoryOutput, $createIfNotExist = false)
 {
     $fileExpected = $resourcesDir . '/' . $className . '.php';
     $fileName = $className . '.php';
     $fileActual = $directoryOutput . '/' . $namespace . '/' . $fileName;
     // echo file_get_contents($fileActual);
     /** @var \Symfony\CS\Config\Config $config */
     $config = ConfigBridge::create(__DIR__ . '/../../');
     $config->setUsingCache(false);
     $fixer = new Fixer();
     $fixer->registerBuiltInFixers();
     $fixer->registerBuiltInConfigs();
     // $fixer->setLintManager(new LintManager());
     $fixer->registerCustomFixers($config->getCustomFixers());
     $cresolver = new ConfigurationResolver();
     $cresolver->setConfig($config);
     $cresolver->setAllFixers($fixer->getFixers());
     $cresolver->setOption('level', 'symfony');
     // $cresolver->setOption('fixers', 'eof_ending,strict_param,short_array_syntax,trailing_spaces,indentation,line_after_namespace,php_closing_tag');
     $cresolver->setOption('fixers', 'binary_operator_spaces,blank_line_after_namespace,blank_line_after_opening_tag,blank_line_before_return,
                                      braces,cast_spaces,class_definition,concat_without_spaces,declare_equal_normalize,elseif,encoding,
                                      full_opening_tag,function_declaration,function_typehint_space,hash_to_slash_comment,heredoc_to_nowdoc,
                                      include,lowercase_cast,lowercase_constants,lowercase_keywords,method_argument_space,method_separation,
                                      native_function_casing,new_with_braces,no_alias_functions,no_blank_lines_after_class_opening,
                                      no_blank_lines_after_phpdoc,no_closing_tag,no_empty_phpdoc,no_empty_statement,
                                      no_extra_consecutive_blank_lines,no_leading_import_slash,no_leading_namespace_whitespace,
                                      no_multiline_whitespace_around_double_arrow,no_short_bool_cast,no_singleline_whitespace_before_semicolons,
                                      no_spaces_after_function_name,no_spaces_inside_offset,no_spaces_inside_parenthesis,no_tab_indentation,
                                      no_trailing_comma_in_list_call,no_trailing_comma_in_singleline_array,no_trailing_whitespace,
                                      no_trailing_whitespace_in_comment,no_unneeded_control_parentheses,no_unreachable_default_argument_value,
                                      no_unused_imports,no_whitespace_before_comma_in_array,no_whitespace_in_blank_line,normalize_index_brace,
                                      object_operator_without_whitespace,phpdoc_align,phpdoc_annotation_without_dot,phpdoc_indent,
                                      phpdoc_inline_tag,phpdoc_no_access,phpdoc_no_empty_return,phpdoc_no_package,phpdoc_scalar,
                                      phpdoc_separation,phpdoc_single_line_var_spacing,phpdoc_to_comment,phpdoc_trim,
                                      phpdoc_type_to_var,phpdoc_types,phpdoc_var_without_name,pre_increment,print_to_echo,psr4,self_accessor,
                                      short_scalar_cast,simplified_null_return,single_blank_line_at_eof,single_blank_line_before_namespace,
                                      single_class_element_per_statement,single_import_per_statement,single_line_after_imports,single_quote,
                                      space_after_semicolon,standardize_not_equals,switch_case_semicolon_to_colon,switch_case_space,
                                      ternary_operator_spaces,trailing_comma_in_multiline_array,trim_array_spaces,unalign_double_arrow,
                                      unalign_equals,unary_operator_spaces,unix_line_endings,visibility_required,whitespace_after_comma_in_array,
                                      short_array_syntax,linebreak_after_opening_tag,ordered_imports,no_useless_return,phpdoc_order,ordered_use,
                                      -phpdoc_short_description');
     $cresolver->resolve();
     $config->fixers($cresolver->getFixers());
     // $fileCacheManager = new FileCacheManager(false, $directoryOutput, $cresolver->getFixers());
     $iFile = new SplFileInfo($fileActual, $directoryOutput . '/' . $namespace, $fileName);
     // $fixer->fixFile($iFile, $cresolver->getFixers(), false, false, $fileCacheManager);
     $config->finder(new \ArrayIterator([$iFile]));
     // $changed =
     $fixer->fix($config, false, false);
     $fileActualFixed = $iFile->getPathname();
     $actual = file_get_contents($fileActualFixed);
     if (!file_exists($fileExpected) && $createIfNotExist) {
         file_put_contents($fileExpected, $actual);
     }
     $expected = file_get_contents($fileExpected);
     $this->assertSame($expected, $actual, 'Classe ' . $className . ' invalid');
 }
示例#2
0
 /**
  * @see Command
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $path = $input->getArgument('path');
     $stdin = false;
     if ('-' === $path) {
         $stdin = true;
         // Can't write to STDIN
         $input->setOption('dry-run', true);
     }
     if (null !== $path) {
         $filesystem = new Filesystem();
         if (!$filesystem->isAbsolutePath($path)) {
             $path = getcwd() . DIRECTORY_SEPARATOR . $path;
         }
     }
     $configFile = $input->getOption('config-file');
     if (null === $configFile) {
         if (is_file($path) && ($dirName = pathinfo($path, PATHINFO_DIRNAME))) {
             $configDir = $dirName;
         } elseif ($stdin || null === $path) {
             $configDir = getcwd();
             // path is directory
         } else {
             $configDir = $path;
         }
         $configFile = $configDir . DIRECTORY_SEPARATOR . '.php_cs';
     }
     if ($input->getOption('config')) {
         $config = null;
         foreach ($this->fixer->getConfigs() as $c) {
             if ($c->getName() === $input->getOption('config')) {
                 $config = $c;
                 break;
             }
         }
         if (null === $config) {
             throw new \InvalidArgumentException(sprintf('The configuration "%s" is not defined', $input->getOption('config')));
         }
     } elseif (file_exists($configFile)) {
         $config = (include $configFile);
         // verify that the config has an instance of Config
         if (!$config instanceof Config) {
             throw new \UnexpectedValueException(sprintf('The config file "%s" does not return an instance of Symfony\\CS\\Config\\Config', $configFile));
         }
         if ('txt' === $input->getOption('format')) {
             $output->writeln(sprintf('Loaded config from "%s"', $configFile));
         }
     } else {
         $config = $this->defaultConfig;
     }
     if ($config->usingLinter()) {
         $this->fixer->setLintManager(new LintManager());
     }
     if (is_file($path)) {
         $config->finder(new \ArrayIterator(array(new \SplFileInfo($path))));
     } elseif ($stdin) {
         $config->finder(new \ArrayIterator(array(new StdinFileInfo())));
     } elseif (null !== $path) {
         $config->setDir($path);
     }
     // register custom fixers from config
     $this->fixer->registerCustomFixers($config->getCustomFixers());
     $resolver = new ConfigurationResolver();
     $resolver->setAllFixers($this->fixer->getFixers())->setConfig($config)->setOptions(array('level' => $input->getOption('level'), 'fixers' => $input->getOption('fixers'), 'progress' => $output->isVerbose() && 'txt' === $input->getOption('format')))->resolve();
     $config->fixers($resolver->getFixers());
     $showProgress = $resolver->getProgress();
     if ($showProgress) {
         $fileProcessedEventListener = function (FixerFileProcessedEvent $event) use($output) {
             $output->write($event->getStatusAsString());
         };
         $this->fixer->setEventDispatcher($this->eventDispatcher);
         $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener);
     }
     $this->stopwatch->start('fixFiles');
     $changed = $this->fixer->fix($config, $input->getOption('dry-run'), $input->getOption('diff'));
     $this->stopwatch->stop('fixFiles');
     if ($showProgress) {
         $this->fixer->setEventDispatcher(null);
         $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener);
         $output->writeln('');
         $legend = array();
         foreach (FixerFileProcessedEvent::getStatusMap() as $status) {
             if ($status['symbol'] && $status['description']) {
                 $legend[] = $status['symbol'] . '-' . $status['description'];
             }
         }
         $output->writeln('Legend: ' . implode(', ', array_unique($legend)));
     }
     $verbosity = $output->getVerbosity();
     $i = 1;
     switch ($input->getOption('format')) {
         case 'txt':
             foreach ($changed as $file => $fixResult) {
                 $output->write(sprintf('%4d) %s', $i++, $file));
                 if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) {
                     $output->write(sprintf(' (<comment>%s</comment>)', implode(', ', $fixResult['appliedFixers'])));
                 }
                 if ($input->getOption('diff')) {
                     $output->writeln('');
                     $output->writeln('<comment>      ---------- begin diff ----------</comment>');
                     $output->writeln($fixResult['diff']);
                     $output->writeln('<comment>      ---------- end diff ----------</comment>');
                 }
                 $output->writeln('');
             }
             if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) {
                 $output->writeln('Fixing time per file:');
                 foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) {
                     if ('__section__' === $file) {
                         continue;
                     }
                     $output->writeln(sprintf('[%.3f s] %s', $event->getDuration() / 1000, $file));
                 }
                 $output->writeln('');
             }
             $fixEvent = $this->stopwatch->getEvent('fixFiles');
             $output->writeln(sprintf('Fixed all files in %.3f seconds, %.3f MB memory used', $fixEvent->getDuration() / 1000, $fixEvent->getMemory() / 1024 / 1024));
             break;
         case 'xml':
             $dom = new \DOMDocument('1.0', 'UTF-8');
             $filesXML = $dom->createElement('files');
             $dom->appendChild($filesXML);
             foreach ($changed as $file => $fixResult) {
                 $fileXML = $dom->createElement('file');
                 $fileXML->setAttribute('id', $i++);
                 $fileXML->setAttribute('name', $file);
                 $filesXML->appendChild($fileXML);
                 if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) {
                     $appliedFixersXML = $dom->createElement('applied_fixers');
                     $fileXML->appendChild($appliedFixersXML);
                     foreach ($fixResult['appliedFixers'] as $appliedFixer) {
                         $appliedFixerXML = $dom->createElement('applied_fixer');
                         $appliedFixerXML->setAttribute('name', $appliedFixer);
                         $appliedFixersXML->appendChild($appliedFixerXML);
                     }
                 }
                 if ($input->getOption('diff')) {
                     $diffXML = $dom->createElement('diff');
                     $diffXML->appendChild($dom->createCDATASection($fixResult['diff']));
                     $fileXML->appendChild($diffXML);
                 }
             }
             $fixEvent = $this->stopwatch->getEvent('fixFiles');
             $timeXML = $dom->createElement('time');
             $memoryXML = $dom->createElement('memory');
             $dom->appendChild($timeXML);
             $dom->appendChild($memoryXML);
             $memoryXML->setAttribute('value', round($fixEvent->getMemory() / 1024 / 1024, 3));
             $memoryXML->setAttribute('unit', 'MB');
             $timeXML->setAttribute('unit', 's');
             $timeTotalXML = $dom->createElement('total');
             $timeTotalXML->setAttribute('value', round($fixEvent->getDuration() / 1000, 3));
             $timeXML->appendChild($timeTotalXML);
             if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) {
                 $timeFilesXML = $dom->createElement('files');
                 $timeXML->appendChild($timeFilesXML);
                 $eventCounter = 1;
                 foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) {
                     if ('__section__' === $file) {
                         continue;
                     }
                     $timeFileXML = $dom->createElement('file');
                     $timeFilesXML->appendChild($timeFileXML);
                     $timeFileXML->setAttribute('id', $eventCounter++);
                     $timeFileXML->setAttribute('name', $file);
                     $timeFileXML->setAttribute('value', round($event->getDuration() / 1000, 3));
                 }
             }
             $dom->formatOutput = true;
             $output->write($dom->saveXML());
             break;
         case 'json':
             $jFiles = array();
             foreach ($changed as $file => $fixResult) {
                 $jfile = array('name' => $file);
                 if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) {
                     $jfile['appliedFixers'] = $fixResult['appliedFixers'];
                 }
                 if ($input->getOption('diff')) {
                     $jfile['diff'] = $fixResult['diff'];
                 }
                 $jFiles[] = $jfile;
             }
             $fixEvent = $this->stopwatch->getEvent('fixFiles');
             $json = array('files' => $jFiles, 'memory' => round($fixEvent->getMemory() / 1024 / 1024, 3), 'time' => array('total' => round($fixEvent->getDuration() / 1000, 3)));
             if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) {
                 $jFileTime = array();
                 foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) {
                     if ('__section__' === $file) {
                         continue;
                     }
                     $jFileTime[$file] = round($event->getDuration() / 1000, 3);
                 }
                 $json['time']['files'] = $jFileTime;
             }
             $output->write(json_encode($json));
             break;
         default:
             throw new \InvalidArgumentException(sprintf('The format "%s" is not defined.', $input->getOption('format')));
     }
     if (!$this->errorsManager->isEmpty()) {
         $output->writeLn('');
         $output->writeLn('Files that were not fixed due to internal error:');
         foreach ($this->errorsManager->getErrors() as $i => $error) {
             $output->writeLn(sprintf('%4d) %s', $i + 1, $error['filepath']));
         }
     }
     return empty($changed) ? 0 : 1;
 }
 /**
  * Uses PHP CS Fixer to make generated files following PSR and Symfony Coding Standards.
  *
  * @param array $files
  */
 private function fixCs(array $files)
 {
     $config = new Config();
     $fixer = new Fixer();
     $fixer->registerBuiltInConfigs();
     $fixer->registerBuiltInFixers();
     $resolver = new ConfigurationResolver();
     $resolver->setAllFixers($fixer->getFixers())->setConfig($config)->setOptions(array('level' => 'symfony', 'fixers' => null, 'progress' => false))->resolve();
     $config->fixers($resolver->getFixers());
     $finder = [];
     foreach ($files as $file) {
         $finder[] = new \SplFileInfo($file);
     }
     $config->finder(new \ArrayIterator($finder));
     $fixer->fix($config);
 }
示例#4
0
 /**
  * @see Command
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     // setup output
     $stdErr = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : ('txt' === $input->getOption('format') ? $output : null);
     if (null !== $stdErr && extension_loaded('xdebug')) {
         $stdErr->writeln(sprintf($stdErr->isDecorated() ? '<bg=yellow;fg=black;>%s</>' : '%s', 'You are running php-cs-fixer with xdebug enabled. This has a major impact on runtime performance.'));
     }
     $verbosity = $output->getVerbosity();
     // setup input
     $path = $input->getArgument('path');
     $stdin = false;
     if ('-' === $path) {
         $stdin = true;
         // Can't write to STDIN
         $input->setOption('dry-run', true);
     }
     if (null !== $path) {
         $filesystem = new Filesystem();
         if (!$filesystem->isAbsolutePath($path)) {
             $path = getcwd() . DIRECTORY_SEPARATOR . $path;
         }
     }
     // setup configuration location
     $configFile = $input->getOption('config-file');
     if (null === $configFile) {
         $configDir = $path;
         if (is_file($path) && ($dirName = pathinfo($path, PATHINFO_DIRNAME))) {
             $configDir = $dirName;
         } elseif ($stdin || null === $path) {
             $configDir = getcwd();
             // path is directory
         }
         $configFile = $configDir . DIRECTORY_SEPARATOR . '.php_cs';
     }
     if ($input->getOption('config')) {
         $config = null;
         foreach ($this->fixer->getConfigs() as $c) {
             if ($c->getName() === $input->getOption('config')) {
                 $config = $c;
                 break;
             }
         }
         if (null === $config) {
             throw new InvalidConfigurationException(sprintf('The configuration "%s" is not defined.', $input->getOption('config')));
         }
     } elseif (file_exists($configFile)) {
         $config = (include $configFile);
         // verify that the config has an instance of Config
         if (!$config instanceof ConfigInterface) {
             throw new InvalidConfigurationException(sprintf('The config file "%s" does not return a "Symfony\\CS\\ConfigInterface" instance. Got: "%s".', $configFile, is_object($config) ? get_class($config) : gettype($config)));
         }
         if (null !== $stdErr && $configFile) {
             $stdErr->writeln(sprintf('Loaded config from "%s".', $configFile));
         }
     } else {
         $config = $this->defaultConfig;
     }
     // setup location of source(s) to fix
     if (is_file($path)) {
         $config->finder(new \ArrayIterator(array(new \SplFileInfo($path))));
     } elseif ($stdin) {
         $config->finder(new \ArrayIterator(array(new StdinFileInfo())));
     } elseif (null !== $path) {
         $config->setDir($path);
     }
     // setup Linter
     if ($config->usingLinter()) {
         $this->fixer->setLintManager(new LintManager());
     }
     // register custom fixers from config
     $this->fixer->registerCustomFixers($config->getCustomFixers());
     $resolver = new ConfigurationResolver();
     $resolver->setAllFixers($this->fixer->getFixers())->setConfig($config)->setOptions(array('level' => $input->getOption('level'), 'fixers' => $input->getOption('fixers'), 'progress' => OutputInterface::VERBOSITY_VERBOSE <= $verbosity && 'txt' === $input->getOption('format'), 'format' => $input->getOption('format')))->resolve();
     $config->fixers($resolver->getFixers());
     $showProgress = null !== $stdErr && $resolver->getProgress();
     if ($showProgress) {
         $fileProcessedEventListener = function (FixerFileProcessedEvent $event) use($stdErr) {
             $stdErr->write($event->getStatusAsString());
         };
         $this->fixer->setEventDispatcher($this->eventDispatcher);
         $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener);
     }
     $isDiff = $input->getOption('diff');
     $this->stopwatch->start('fixFiles');
     $changed = $this->fixer->fix($config, $input->getOption('dry-run'), $isDiff);
     $this->stopwatch->stop('fixFiles');
     if ($showProgress) {
         $this->fixer->setEventDispatcher(null);
         $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener);
         $stdErr->writeln('');
         $legend = array();
         foreach (FixerFileProcessedEvent::getStatusMap() as $status) {
             if ($status['symbol'] && $status['description']) {
                 $legend[] = $status['symbol'] . '-' . $status['description'];
             }
         }
         $stdErr->writeln('Legend: ' . implode(', ', array_unique($legend)));
     }
     $i = 1;
     switch ($resolver->getFormat()) {
         case 'txt':
             $fixerDetailLine = false;
             if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) {
                 $fixerDetailLine = $output->isDecorated() ? ' (<comment>%s</comment>)' : ' %s';
             }
             foreach ($changed as $file => $fixResult) {
                 $output->write(sprintf('%4d) %s', $i++, $file));
                 if ($fixerDetailLine) {
                     $output->write(sprintf($fixerDetailLine, implode(', ', $fixResult['appliedFixers'])));
                 }
                 if ($isDiff) {
                     $output->writeln('');
                     $output->writeln('<comment>      ---------- begin diff ----------</comment>');
                     if ($output->isDecorated()) {
                         $diff = implode(PHP_EOL, array_map(function ($string) {
                             $string = preg_replace('/^(\\+){3}/', '<info>+++</info>', $string);
                             $string = preg_replace('/^(\\+){1}/', '<info>+</info>', $string);
                             $string = preg_replace('/^(\\-){3}/', '<error>---</error>', $string);
                             $string = preg_replace('/^(\\-){1}/', '<error>-</error>', $string);
                             $string = str_repeat(' ', 6) . $string;
                             return $string;
                         }, explode(PHP_EOL, OutputFormatter::escape($fixResult['diff']))));
                         $output->writeln($diff);
                     } else {
                         $output->writeln($fixResult['diff'], OutputInterface::OUTPUT_RAW);
                     }
                     $output->writeln('<comment>      ---------- end diff ----------</comment>');
                 }
                 $output->writeln('');
             }
             if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) {
                 $output->writeln('Fixing time per file:');
                 foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) {
                     if ('__section__' === $file) {
                         continue;
                     }
                     $output->writeln(sprintf('[%.3f s] %s', $event->getDuration() / 1000, $file));
                 }
                 $output->writeln('');
             }
             $fixEvent = $this->stopwatch->getEvent('fixFiles');
             $output->writeln(sprintf('%s all files in %.3f seconds, %.3f MB memory used', $input->getOption('dry-run') ? 'Checked' : 'Fixed', $fixEvent->getDuration() / 1000, $fixEvent->getMemory() / 1024 / 1024));
             break;
         case 'xml':
             $dom = new \DOMDocument('1.0', 'UTF-8');
             $filesXML = $dom->createElement('files');
             $dom->appendChild($filesXML);
             foreach ($changed as $file => $fixResult) {
                 $fileXML = $dom->createElement('file');
                 $fileXML->setAttribute('id', $i++);
                 $fileXML->setAttribute('name', $file);
                 $filesXML->appendChild($fileXML);
                 if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) {
                     $appliedFixersXML = $dom->createElement('applied_fixers');
                     $fileXML->appendChild($appliedFixersXML);
                     foreach ($fixResult['appliedFixers'] as $appliedFixer) {
                         $appliedFixerXML = $dom->createElement('applied_fixer');
                         $appliedFixerXML->setAttribute('name', $appliedFixer);
                         $appliedFixersXML->appendChild($appliedFixerXML);
                     }
                 }
                 if ($isDiff) {
                     $diffXML = $dom->createElement('diff');
                     $diffXML->appendChild($dom->createCDATASection($fixResult['diff']));
                     $fileXML->appendChild($diffXML);
                 }
             }
             $dom->formatOutput = true;
             $output->write($dom->saveXML(), false, OutputInterface::OUTPUT_RAW);
             break;
         case 'json':
             $jFiles = array();
             foreach ($changed as $file => $fixResult) {
                 $jfile = array('name' => $file);
                 if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) {
                     $jfile['appliedFixers'] = $fixResult['appliedFixers'];
                 }
                 if ($isDiff) {
                     $jfile['diff'] = $fixResult['diff'];
                 }
                 $jFiles[] = $jfile;
             }
             $fixEvent = $this->stopwatch->getEvent('fixFiles');
             $json = array('files' => $jFiles, 'memory' => round($fixEvent->getMemory() / 1024 / 1024, 3), 'time' => array('total' => round($fixEvent->getDuration() / 1000, 3)));
             if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) {
                 $jFileTime = array();
                 foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) {
                     if ('__section__' === $file) {
                         continue;
                     }
                     $jFileTime[$file] = round($event->getDuration() / 1000, 3);
                 }
                 $json['time']['files'] = $jFileTime;
             }
             $output->write(json_encode($json), false, OutputInterface::OUTPUT_RAW);
             break;
     }
     if (null !== $stdErr && !$this->errorsManager->isEmpty()) {
         $stdErr->writeln('');
         $stdErr->writeln('Files that were not fixed due to internal error:');
         foreach ($this->errorsManager->getErrors() as $i => $error) {
             $stdErr->writeln(sprintf('%4d) %s', $i + 1, $error['filepath']));
         }
     }
     return 0 === count($changed) ? 0 : 1;
 }