From 50de92e39914169773f0f958e8c3691b257994d3 Mon Sep 17 00:00:00 2001 From: flynsarmy Date: Wed, 9 Mar 2022 21:11:51 +1000 Subject: [PATCH] Make compatible with PSR-12 formatting standard --- .phpcs.xml | 22 +++++++++ composer.json | 11 ++++- src/ImageOptimizer/ChainOptimizer.php | 16 +++++-- src/ImageOptimizer/ChangedOutputOptimizer.php | 7 ++- src/ImageOptimizer/Command.php | 35 +++++++++----- src/ImageOptimizer/CommandOptimizer.php | 6 +-- .../Exception/CommandNotFound.php | 3 +- src/ImageOptimizer/Exception/Exception.php | 3 +- src/ImageOptimizer/Optimizer.php | 4 +- src/ImageOptimizer/OptimizerFactory.php | 38 ++++++++++----- src/ImageOptimizer/SmartOptimizer.php | 5 +- src/ImageOptimizer/SuppressErrorOptimizer.php | 9 ++-- .../TypeGuesser/ExtensionTypeGuesser.php | 7 ++- .../TypeGuesser/GdTypeGuesser.php | 8 ++-- .../TypeGuesser/SmartTypeGuesser.php | 8 ++-- .../TypeGuesser/TypeGuesser.php | 13 +++--- src/ImageOptimizer/WrapperOptimizer.php | 6 ++- .../Assertion/ImageAssertion.php | 7 +-- tests/ImageOptimizer/CommandTest.php | 3 +- tests/ImageOptimizer/ImageSimilarityJudge.php | 20 ++++---- .../ImageSimilarityJudgeTest.php | 5 +- tests/ImageOptimizer/OptimizersTest.php | 46 +++++++++++-------- tests/ImageOptimizer/SmartOptimizerTest.php | 14 +++--- .../TypeGuesser/AbstractTypeGuesserTest.php | 10 ++-- .../TypeGuesser/ExtensionTypeGuesserTest.php | 5 +- .../TypeGuesser/GdTypeGuesserTest.php | 3 +- .../TypeGuesser/SmartTypeGuesserTest.php | 5 +- tests/bootstrap.php | 4 +- 28 files changed, 203 insertions(+), 120 deletions(-) create mode 100755 .phpcs.xml diff --git a/.phpcs.xml b/.phpcs.xml new file mode 100755 index 0000000..86bc432 --- /dev/null +++ b/.phpcs.xml @@ -0,0 +1,22 @@ + + + A custom set of code standard rules + + + + + + tests/* + + + + tests/* + + + + tests/* + + + *\.(?!php$) + vendor/* + diff --git a/composer.json b/composer.json index 1e9e104..77e0abc 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,15 @@ }, "require-dev": { "phpunit/phpunit": "^9.5", - "ext-gd": "*" + "ext-gd": "*", + "squizlabs/php_codesniffer": "^3.6" + }, + "scripts": { + "phpcs": "vendor/bin/phpcs -s --standard=./.phpcs.xml ./", + "phpcbf": "vendor/bin/phpcbf --standard=./.phpcs.xml ./", + "test": [ + "composer validate --strict", + "@phpcs" + ] } } diff --git a/src/ImageOptimizer/ChainOptimizer.php b/src/ImageOptimizer/ChainOptimizer.php index 0850bf3..78a1d4f 100644 --- a/src/ImageOptimizer/ChainOptimizer.php +++ b/src/ImageOptimizer/ChainOptimizer.php @@ -1,4 +1,5 @@ optimizers as $optimizer) { + foreach ($this->optimizers as $optimizer) { try { $optimizer->optimize($filepath); - if($this->executeFirst) break; + if ($this->executeFirst) { + break; + } } catch (Exception $e) { - $this->logger->error('Error during image optimization. See exception for more details.', [ 'exception' => $e ]); + $this->logger->error( + 'Error during image optimization. See exception for more details.', + ['exception' => $e] + ); $exceptions[] = $e; } } - if(count($exceptions) === count($this->optimizers)) { + if (count($exceptions) === count($this->optimizers)) { throw new Exception(sprintf('All optimizers failed to optimize the file: %s', $filepath)); } } -} \ No newline at end of file +} diff --git a/src/ImageOptimizer/ChangedOutputOptimizer.php b/src/ImageOptimizer/ChangedOutputOptimizer.php index 993febf..38d157b 100644 --- a/src/ImageOptimizer/ChangedOutputOptimizer.php +++ b/src/ImageOptimizer/ChangedOutputOptimizer.php @@ -1,4 +1,5 @@ outputPattern ); diff --git a/src/ImageOptimizer/Command.php b/src/ImageOptimizer/Command.php index ff01648..f03f3bb 100644 --- a/src/ImageOptimizer/Command.php +++ b/src/ImageOptimizer/Command.php @@ -1,9 +1,9 @@ cmd = $bin; @@ -38,17 +44,24 @@ public function execute(array $customArgs = []): void try { $exitCode = $process->run(); $commandLine = $process->getCommandLine(); - $output = $process->getOutput().PHP_EOL.$process->getErrorOutput(); + $output = $process->getOutput() . PHP_EOL . $process->getErrorOutput(); - if($exitCode == 127) { + if ($exitCode == 127) { throw new CommandNotFound(sprintf('Command "%s" not found.', $this->cmd)); } - if($exitCode !== 0 || stripos($output, 'error') !== false || stripos($output, 'permission') !== false) { - throw new Exception(sprintf('Command failed, return code: %d, command: %s, stderr: %s', $exitCode, $commandLine, trim($output))); + if ($exitCode !== 0 || stripos($output, 'error') !== false || stripos($output, 'permission') !== false) { + throw new Exception( + sprintf( + 'Command failed, return code: %d, command: %s, stderr: %s', + $exitCode, + $commandLine, + trim($output) + ) + ); } - } catch(RuntimeException $e) { + } catch (RuntimeException $e) { throw new Exception($e->getMessage(), $e->getCode(), $e); } } -} \ No newline at end of file +} diff --git a/src/ImageOptimizer/CommandOptimizer.php b/src/ImageOptimizer/CommandOptimizer.php index 021b15a..4a22f7c 100644 --- a/src/ImageOptimizer/CommandOptimizer.php +++ b/src/ImageOptimizer/CommandOptimizer.php @@ -1,9 +1,9 @@ extraArgs) { + if ($this->extraArgs) { $customArgs = array_merge( is_callable($this->extraArgs) ? call_user_func($this->extraArgs, $filepath) : $this->extraArgs, $customArgs @@ -28,4 +28,4 @@ public function optimize(string $filepath): void $this->command->execute($customArgs); } -} \ No newline at end of file +} diff --git a/src/ImageOptimizer/Exception/CommandNotFound.php b/src/ImageOptimizer/Exception/CommandNotFound.php index 7bb1056..c402618 100644 --- a/src/ImageOptimizer/Exception/CommandNotFound.php +++ b/src/ImageOptimizer/Exception/CommandNotFound.php @@ -1,8 +1,9 @@ commandOptimizer('optipng', $this->options['optipng_options']) ); $this->optimizers['pngquant'] = $this->wrap( - $this->commandOptimizer('pngquant', $this->options['pngquant_options'], - function($filepath){ + $this->commandOptimizer( + 'pngquant', + $this->options['pngquant_options'], + function ($filepath) { $ext = pathinfo($filepath, PATHINFO_EXTENSION); - return ['--ext='.($ext ? '.'.$ext : ''), '--']; + return ['--ext=' . ($ext ? '.' . $ext : ''), '--']; } ) ); @@ -109,7 +111,9 @@ function($filepath){ $this->commandOptimizer('jpegoptim', $this->options['jpegoptim_options']) ); $this->optimizers['jpegtran'] = $this->wrap( - $this->commandOptimizer('jpegtran', $this->options['jpegtran_options'], + $this->commandOptimizer( + 'jpegtran', + $this->options['jpegtran_options'], function ($filepath) { return ['-outfile', $filepath]; } @@ -121,14 +125,16 @@ function ($filepath) { ], $this->options['execute_only_first_jpeg_optimizer'], $this->logger)); $this->optimizers['svg'] = $this->optimizers['svgo'] = $this->wrap( - $this->commandOptimizer('svgo', $this->options['svgo_options'], + $this->commandOptimizer( + 'svgo', + $this->options['svgo_options'], function ($filepath) { return ['--input' => $filepath, '--output' => $filepath]; } ) ); - foreach($this->options['custom_optimizers'] as $key => $options) { + foreach ($this->options['custom_optimizers'] as $key => $options) { $this->optimizers[$key] = $this->wrap( $this->commandOptimizer($options['command'], isset($options['args']) ? $options['args'] : []) ); @@ -152,8 +158,16 @@ private function commandOptimizer(string $command, array $args, $extraArgs = nul private function wrap(Optimizer $optimizer): Optimizer { - $optimizer = $optimizer instanceof ChangedOutputOptimizer ? $optimizer : new ChangedOutputOptimizer($this->option('output_filepath_pattern'), $optimizer); - return $this->option('ignore_errors', true) ? new SuppressErrorOptimizer($optimizer, $this->logger) : $optimizer; + $optimizer = $optimizer instanceof ChangedOutputOptimizer ? + $optimizer : + new ChangedOutputOptimizer( + $this->option('output_filepath_pattern'), + $optimizer + ); + + return $this->option('ignore_errors', true) ? + new SuppressErrorOptimizer($optimizer, $this->logger) : + $optimizer; } private function unwrap(Optimizer $optimizer): Optimizer @@ -164,7 +178,7 @@ private function unwrap(Optimizer $optimizer): Optimizer private function executable(string $name): string { $executableFinder = $this->executableFinder; - return $this->option($name.'_bin', function() use($name, $executableFinder){ + return $this->option($name . '_bin', function () use ($name, $executableFinder) { return $executableFinder->find($name, $name); }); } @@ -181,7 +195,7 @@ private function option(string $name, $default = null) */ public function get(string $name = self::OPTIMIZER_SMART): Optimizer { - if(!isset($this->optimizers[$name])) { + if (!isset($this->optimizers[$name])) { throw new Exception(sprintf('Optimizer "%s" not found', $name)); } diff --git a/src/ImageOptimizer/SmartOptimizer.php b/src/ImageOptimizer/SmartOptimizer.php index 728434f..cd3f179 100644 --- a/src/ImageOptimizer/SmartOptimizer.php +++ b/src/ImageOptimizer/SmartOptimizer.php @@ -1,4 +1,5 @@ typeGuesser->guess($filepath); - if(!isset($this->optimizers[$type])) { + if (!isset($this->optimizers[$type])) { throw new Exception(sprintf('Optimizer for type "%s" not found.', $type)); } $this->optimizers[$type]->optimize($filepath); } -} \ No newline at end of file +} diff --git a/src/ImageOptimizer/SuppressErrorOptimizer.php b/src/ImageOptimizer/SuppressErrorOptimizer.php index 7b189af..881bbcd 100644 --- a/src/ImageOptimizer/SuppressErrorOptimizer.php +++ b/src/ImageOptimizer/SuppressErrorOptimizer.php @@ -1,9 +1,9 @@ optimizer->optimize($filepath); } catch (Exception $e) { - $this->logger->error('Error during image optimization. See exception for more details.', [ 'exception' => $e ]); + $this->logger->error( + 'Error during image optimization. See exception for more details.', + ['exception' => $e] + ); } } @@ -31,4 +34,4 @@ public function unwrap(): Optimizer { return $this->optimizer instanceof WrapperOptimizer ? $this->optimizer->unwrap() : $this->optimizer; } -} \ No newline at end of file +} diff --git a/src/ImageOptimizer/TypeGuesser/ExtensionTypeGuesser.php b/src/ImageOptimizer/TypeGuesser/ExtensionTypeGuesser.php index 8767718..75a5fdb 100644 --- a/src/ImageOptimizer/TypeGuesser/ExtensionTypeGuesser.php +++ b/src/ImageOptimizer/TypeGuesser/ExtensionTypeGuesser.php @@ -1,12 +1,11 @@ typeGuessers as $typeGuesser) { + foreach ($this->typeGuessers as $typeGuesser) { $type = $typeGuesser->guess($filepath); - if($type !== self::TYPE_UNKNOWN) { + if ($type !== self::TYPE_UNKNOWN) { return $type; } } return self::TYPE_UNKNOWN; } -} \ No newline at end of file +} diff --git a/src/ImageOptimizer/TypeGuesser/TypeGuesser.php b/src/ImageOptimizer/TypeGuesser/TypeGuesser.php index b42773f..d30a6bc 100644 --- a/src/ImageOptimizer/TypeGuesser/TypeGuesser.php +++ b/src/ImageOptimizer/TypeGuesser/TypeGuesser.php @@ -1,19 +1,20 @@ originalImage); - $actualPercent = filesize($this->optimizedImage)/ $originalFilesize * 100; + $actualPercent = filesize($this->optimizedImage) / $originalFilesize * 100; Assert::assertLessThan($percent, $actualPercent, 'compression level is too small'); @@ -46,10 +47,10 @@ public function imagesHaveTheSameDimensions(): ImageAssertion public function imagesAreSimilarInPercent(float $percent): ImageAssertion { $similarity = ImageSimilarityJudge::judge($this->originalImage, $this->optimizedImage); - $percent = $percent/100; + $percent = $percent / 100; Assert::assertGreaterThan($percent, $similarity); return $this; } -} \ No newline at end of file +} diff --git a/tests/ImageOptimizer/CommandTest.php b/tests/ImageOptimizer/CommandTest.php index 2fd33eb..5542246 100644 --- a/tests/ImageOptimizer/CommandTest.php +++ b/tests/ImageOptimizer/CommandTest.php @@ -1,4 +1,5 @@ assertSame(false, $exception); } -} \ No newline at end of file +} diff --git a/tests/ImageOptimizer/ImageSimilarityJudge.php b/tests/ImageOptimizer/ImageSimilarityJudge.php index 162102e..8977e9e 100644 --- a/tests/ImageOptimizer/ImageSimilarityJudge.php +++ b/tests/ImageOptimizer/ImageSimilarityJudge.php @@ -1,10 +1,9 @@ guess($image1) === TypeGuesser::TYPE_SVG || $typeGuesser->guess($image2) === TypeGuesser::TYPE_SVG) { + if ( + $typeGuesser->guess($image1) === TypeGuesser::TYPE_SVG || + $typeGuesser->guess($image2) === TypeGuesser::TYPE_SVG + ) { return 1; } @@ -35,8 +37,8 @@ public static function judge(string $image1, string $image2): float $delta = 0; - for($x=0; $x<$width; $x++) { - for($y=0; $y<$height; $y++) { + for ($x = 0; $x < $width; $x++) { + for ($y = 0; $y < $height; $y++) { //is faster about 30% than array_sum(array_map(...)) solution $color1 = self::colorAt($resource1, $x, $y); $color2 = self::colorAt($resource2, $x, $y); @@ -46,7 +48,7 @@ public static function judge(string $image1, string $image2): float } } - return 1 - ($width && $height ? $delta/(3*255*$width*$height) : 0); + return 1 - ($width && $height ? $delta / (3 * 255 * $width * $height) : 0); } private static function createResource(string $image) @@ -54,9 +56,9 @@ private static function createResource(string $image) $typeGuesser = new SmartTypeGuesser(); $type = $typeGuesser->guess($image); - $function = 'imagecreatefrom'.$type; + $function = 'imagecreatefrom' . $type; - if(!function_exists($function)) { + if (!function_exists($function)) { throw new InvalidArgumentException(sprintf('Image "%s" is not supported', $type)); } @@ -68,4 +70,4 @@ private static function colorAt($image, int $x, int $y): array $colorIndex = imagecolorat($image, $x, $y); return imagecolorsforindex($image, $colorIndex); } -} \ No newline at end of file +} diff --git a/tests/ImageOptimizer/ImageSimilarityJudgeTest.php b/tests/ImageOptimizer/ImageSimilarityJudgeTest.php index 7658c7f..be2543c 100644 --- a/tests/ImageOptimizer/ImageSimilarityJudgeTest.php +++ b/tests/ImageOptimizer/ImageSimilarityJudgeTest.php @@ -1,9 +1,9 @@ assertGreaterThanOrEqual($expectedGreaterThan, $actual); $this->assertLessThanOrEqual($expectedLessThan, $actual); @@ -30,4 +30,3 @@ public function judgeProvider() ]; } } - \ No newline at end of file diff --git a/tests/ImageOptimizer/OptimizersTest.php b/tests/ImageOptimizer/OptimizersTest.php index c815155..4258a7d 100644 --- a/tests/ImageOptimizer/OptimizersTest.php +++ b/tests/ImageOptimizer/OptimizersTest.php @@ -1,4 +1,5 @@ get('png'); - $optimizer->optimize(__DIR__.'/Resources/sample.jpg'); + $optimizer->optimize(__DIR__ . '/Resources/sample.jpg'); } /** @@ -98,7 +102,7 @@ public function givenUnsupportedFileForOptimizer_givenIgnoreErrorEnabled_ok() $optimizer = $factory->get('png'); - $optimizer->optimize(__DIR__.'/Resources/sample.jpg'); + $optimizer->optimize(__DIR__ . '/Resources/sample.jpg'); } /** @@ -110,11 +114,11 @@ public function givenOutputPath_optimizeOutputFile() $optimizer = $factory->get('jpg'); - $sampleFile = $this->prepareSampleFile(__DIR__.'/Resources/sample.jpg'); + $sampleFile = $this->prepareSampleFile(__DIR__ . '/Resources/sample.jpg'); $optimizer->optimize($sampleFile); - ImageAssertion::create($sampleFile, __DIR__.'/Resources/'.self::TMP_DIR.'/sample-optimized.jpg') + ImageAssertion::create($sampleFile, __DIR__ . '/Resources/' . self::TMP_DIR . '/sample-optimized.jpg') ->imagesHaveTheSameDimensions() ->optimizedFileIsSmallerThanPercent(99) ->imagesAreSimilarInPercent(98.7) @@ -141,32 +145,34 @@ public function optimizerFailed_optimizeChangedOutputFileWillBeDeleted() $optimizer = $factory->get('jpg'); - $sampleFile = $this->prepareSampleFile(__DIR__.'/Resources/sample.jpg'); + $sampleFile = $this->prepareSampleFile(__DIR__ . '/Resources/sample.jpg'); $optimizer->optimize($sampleFile); - $this->assertFileDoesNotExist(__DIR__.'/Resources/'.self::TMP_DIR.'/sample-optimized.jpg'); + $this->assertFileDoesNotExist(__DIR__ . '/Resources/' . self::TMP_DIR . '/sample-optimized.jpg'); // smart optimizer will delete the file if it fails $optimizer = $factory->get(); $optimizer->optimize($sampleFile); - $this->assertFileDoesNotExist(__DIR__.'/Resources/'.self::TMP_DIR.'/sample-optimized.jpg'); + $this->assertFileDoesNotExist(__DIR__ . '/Resources/' . self::TMP_DIR . '/sample-optimized.jpg'); } protected function tearDown(): void { - foreach(['sample.gif', 'sample.jpg', 'sample.png', 'samplepng', 'sample.svg', 'sample-optimized.jpg'] as $file) { - @unlink(__DIR__.'/Resources/'.self::TMP_DIR.'/'.$file); + $files = ['sample.gif', 'sample.jpg', 'sample.png', 'samplepng', 'sample.svg', 'sample-optimized.jpg']; + + foreach ($files as $file) { + @unlink(__DIR__ . '/Resources/' . self::TMP_DIR . '/' . $file); } } private function prepareSampleFile(string $originalFile) { - $destination = __DIR__.'/Resources/'.self::TMP_DIR.'/'.basename($originalFile); - if(!@copy($originalFile, $destination)) { + $destination = __DIR__ . '/Resources/' . self::TMP_DIR . '/' . basename($originalFile); + if (!@copy($originalFile, $destination)) { $this->fail(sprintf('Preparing sample file "%s" failed.', $originalFile)); } return $destination; } -} \ No newline at end of file +} diff --git a/tests/ImageOptimizer/SmartOptimizerTest.php b/tests/ImageOptimizer/SmartOptimizerTest.php index 767fe30..7fd52de 100644 --- a/tests/ImageOptimizer/SmartOptimizerTest.php +++ b/tests/ImageOptimizer/SmartOptimizerTest.php @@ -1,19 +1,19 @@ expectException(\ImageOptimizer\Exception\Exception::class); - + //given $filepath = self::UNSUPPORTED_FILEPATH; @@ -88,4 +88,4 @@ public function guess(string $filepath): string { return isset($this->filepathToType[$filepath]) ? $this->filepathToType[$filepath] : 'unknown'; } -} \ No newline at end of file +} diff --git a/tests/ImageOptimizer/TypeGuesser/AbstractTypeGuesserTest.php b/tests/ImageOptimizer/TypeGuesser/AbstractTypeGuesserTest.php index a5e47a2..febd8d2 100644 --- a/tests/ImageOptimizer/TypeGuesser/AbstractTypeGuesserTest.php +++ b/tests/ImageOptimizer/TypeGuesser/AbstractTypeGuesserTest.php @@ -1,9 +1,9 @@ addPsr4('ImageOptimizer\\', __DIR__.'/ImageOptimizer'); +$loader->addPsr4('ImageOptimizer\\', __DIR__ . '/ImageOptimizer');