From 9b1cf4bdb0dfa1dba5fd0ff0fceb1919e79aee60 Mon Sep 17 00:00:00 2001 From: Nelson Martell Date: Sun, 14 Mar 2021 14:55:07 -0500 Subject: [PATCH] feat: create composer script for phpcbf Add instructions in the README.md file --- .github/screenshots/output1.png | Bin 0 -> 34727 bytes README.md | 81 +++++++++++++++++++- composer.json | 8 ++ src/ComposerScripts.php | 127 ++++++++++++++++++++++++++++++++ 4 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 .github/screenshots/output1.png create mode 100644 src/ComposerScripts.php diff --git a/.github/screenshots/output1.png b/.github/screenshots/output1.png new file mode 100644 index 0000000000000000000000000000000000000000..e2493e822832efd1d850e61649306a4072f32acb GIT binary patch literal 34727 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 I used `"cs:fix-filtered"` name, but you can use any script name you like. + +Configure your Husky + lint-staged in your package.json + +```json +{ + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.php": "composer cs:fix-filtered" + } +} +``` + +> Example for Husky 4. Adapt it if you use Husky 5. + +##### Usage + +You can also run it directly with composer by using `composer cs:fix-filtered {PATHS}`. Example: + +```sh +composer cs:fix-filtered src/ tests/ config/my-config-file.php +``` + +> Note: Non exixtent files/directories are ignored. + +##### Output + +The output is inspired on [pretty-quick](https://github.com/azz/pretty-quick) output: + +```sh +composer cs:fix-filtered config/ src/Example.php src/non-existent-file.php +``` + +![output1](.github/screenshots/output1.png) + +## License + +[![License](https://img.shields.io/github/license/nelson6e65/php-code-sniffer-helpers.svg)](LICENSE) + +Copyright (c) 2021 Nelson Martell + +Read the [`LICENSE` file](LICENSE) for details. diff --git a/composer.json b/composer.json index 7dfaadb..274db88 100644 --- a/composer.json +++ b/composer.json @@ -10,11 +10,19 @@ } ], "scripts": { + "cs:fix-filtered": [ + "NelsonMartell\\PhpCodeSniffer\\ComposerScripts::phpcbf" + ], "cs:php": [ "phpcs src/ -q --standard=Generic --sniffs=Generic.PHP.Syntax --colors", "phpstan analyze" ] }, + "autoload": { + "psr-4": { + "NelsonMartell\\PhpCodeSniffer\\": "src" + } + }, "require": { "php": ">=7.2" }, diff --git a/src/ComposerScripts.php b/src/ComposerScripts.php new file mode 100644 index 0000000..fdc01f6 --- /dev/null +++ b/src/ComposerScripts.php @@ -0,0 +1,127 @@ +getComposer()->getConfig()->get('bin-dir')); + } + + return static::$binDir; + } + + protected static function getVendorDir(Event $event) + { + if (!static::$vendorDir) { + static::$vendorDir = realpath($event->getComposer()->getConfig()->get('vendor-dir')); + } + + return static::$vendorDir; + } + + protected static function bootstrap(Event $event) + { + require_once static::getVendorDir($event) . '/autoload.php'; + } + + /** + * Custom PHP Code Sniffer Fixer to be run with lint-staged pre-commit hook. + */ + public static function phpcbf(Event $event): void + { + $start_time = microtime(true); + + static::bootstrap($event); + + $rootDir = realpath(getcwd()); + + $cmd = str_replace($rootDir . DIRECTORY_SEPARATOR, '', realpath(static::getBinDir($event) . '/phpcbf')); + + $files = $event->getArguments(); + $count = count($files); + + $ignoredPaths = []; + + if ($count > 0) { + $event->getIO()->write("Fixing PHP Coding Standard of ${count} paths."); + + foreach ($files as $i => $file) { + $realPath = realpath($file); + + if (!$realPath) { + $ignoredPaths[] = $file; + continue; + } + + // if ($realPath === realpath(__FILE__)) { + // // Do not self-fix this file when lint-staged + // continue; + // } + + $relativePath = str_replace( + [$rootDir . DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR], + ['', '/'], + $realPath + ); + + $type = strlen($relativePath) < 4 || stripos($relativePath, '.php', -4) === false ? 'directory' : 'file'; + + $event->getIO()->write("Improving ${relativePath} ${type}..."); + + $output = []; + $return = 0; + + // NOTE: workarround: need to run 2 times due to a bug that exits 1 instead of 0 when a file gets fixed + // https://github.com/squizlabs/PHP_CodeSniffer/issues/1818#issuecomment-735620637 + exec("${cmd} \"${realPath}\" || ${cmd} \"${realPath}\" -q", $output, $return); + + $event->getIO()->write($output, true, IOInterface::VERBOSE); + + if ($return !== 0) { + $event->getIO()->error("Error! Unable to autofix the ${relativePath} file!"); + $event->getIO()->write( + 'Run `phpcs` manually to check the conflicting files' + ); + exit(1); + } + } + } + + $event->getIO()->write('Everything is awesome!'); + + $end_time = microtime(true); + $execution_time = round($end_time - $start_time, 2); + + $event->getIO()->write("Done in ${execution_time}s"); + + if (count($ignoredPaths)) { + $ignoredPaths = array_map(function ($item) { + return ' - ' . $item; + }, $ignoredPaths); + + $event->getIO()->write('Note: Some paths were not found:'); + $event->getIO()->write($ignoredPaths); + } + } +}