From 5b210271eb4ec78010a2bafb8e1e0f32e930ed3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=B6ller?= Date: Mon, 15 Jan 2018 22:12:06 +0100 Subject: [PATCH] Enhancement: Implement VersionOrConstraintNormalizer --- README.md | 14 +++ src/Normalizer/ComposerJsonNormalizer.php | 3 +- .../VersionOrConstraintNormalizer.php | 82 ++++++++++++++ .../Normalizer/ComposerJsonNormalizerTest.php | 6 +- .../VersionOrConstraintNormalizerTest.php | 106 ++++++++++++++++++ 5 files changed, 208 insertions(+), 3 deletions(-) create mode 100644 src/Normalizer/VersionOrConstraintNormalizer.php create mode 100644 test/Unit/Normalizer/VersionOrConstraintNormalizerTest.php diff --git a/README.md b/README.md index 88271a8c..62303ea5 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ as well as the following normalizers provided by this package: * [`Localheinz\Composer\Normalize\Normalizer\BinNormalizer`](#binnormalizer) * [`Localheinz\Composer\Normalize\Normalizer\ConfigHashNormalizer`](#confighashnormalizer) * [`Localheinz\Composer\Normalize\Normalizer\PackageHashNormalizer`](#packagehashnormalizer) +* [`Localheinz\Composer\Normalize\Normalizer\VersionOrConstraintNormalizer`](#versionorconstraintnormalizer) ### `BinNormalizer` @@ -79,6 +80,19 @@ sections, the `PackageHashNormalizer` will sort the content of these sections. the `--sort-packages` flag and configuration at https://getcomposer.org/doc/06-config.md#sort-packages and https://getcomposer.org/doc/03-cli.md#require. +### `VersionOrConstraintNormalizer` + +If `composer.json` contains any or (`|` or `||`) version constraints in the + +* `conflict` +* `provide` +* `replaces` +* `require` +* `require-dev` + +sections, the `VersionOrConstraintNormalizer` will ensure that a `||` is +used instead of a `|`, as well as ensure a single space around them. + ## Contributing Please have a look at [`CONTRIBUTING.md`](.github/CONTRIBUTING.md). diff --git a/src/Normalizer/ComposerJsonNormalizer.php b/src/Normalizer/ComposerJsonNormalizer.php index ded83241..cca6f8c5 100644 --- a/src/Normalizer/ComposerJsonNormalizer.php +++ b/src/Normalizer/ComposerJsonNormalizer.php @@ -31,7 +31,8 @@ public function __construct(string $schemaUri = 'https://getcomposer.org/schema. new SchemaNormalizer($schemaUri), new BinNormalizer(), new ConfigHashNormalizer(), - new PackageHashNormalizer() + new PackageHashNormalizer(), + new VersionOrConstraintNormalizer() )); } diff --git a/src/Normalizer/VersionOrConstraintNormalizer.php b/src/Normalizer/VersionOrConstraintNormalizer.php new file mode 100644 index 00000000..b2b757d4 --- /dev/null +++ b/src/Normalizer/VersionOrConstraintNormalizer.php @@ -0,0 +1,82 @@ + $value) { + $packages = (array) $decoded->{$name}; + + if (!\count($packages)) { + continue; + } + + $decoded->{$name} = $this->normalizeOrVersionConstraints($packages); + } + + return \json_encode($decoded); + } + + private function normalizeOrVersionConstraints(array $packages): array + { + return \array_map(function (string $versionConstraint): string { + $orConstraints = \preg_split( + '{\s*\|\|?\s*}', + \trim($versionConstraint) + ); + + if (!\is_array($orConstraints)) { + return $versionConstraint; + } + + return \implode( + ' || ', + $orConstraints + ); + }, $packages); + } +} diff --git a/test/Unit/Normalizer/ComposerJsonNormalizerTest.php b/test/Unit/Normalizer/ComposerJsonNormalizerTest.php index a0574961..a6b6b333 100644 --- a/test/Unit/Normalizer/ComposerJsonNormalizerTest.php +++ b/test/Unit/Normalizer/ComposerJsonNormalizerTest.php @@ -17,6 +17,7 @@ use Localheinz\Composer\Normalize\Normalizer\ComposerJsonNormalizer; use Localheinz\Composer\Normalize\Normalizer\ConfigHashNormalizer; use Localheinz\Composer\Normalize\Normalizer\PackageHashNormalizer; +use Localheinz\Composer\Normalize\Normalizer\VersionOrConstraintNormalizer; use Localheinz\Json\Normalizer\AutoFormatNormalizer; use Localheinz\Json\Normalizer\ChainNormalizer; use Localheinz\Json\Normalizer\NormalizerInterface; @@ -41,6 +42,7 @@ public function testComposesNormalizers() BinNormalizer::class, ConfigHashNormalizer::class, PackageHashNormalizer::class, + VersionOrConstraintNormalizer::class, ]; $this->assertComposesNormalizers($normalizerClassNames, $chainNormalizer); @@ -84,7 +86,7 @@ public function testNormalizeNormalizes() "require-dev": { "localheinz/test-util": "0.6.1", "phpunit/phpunit": "^6.5.5", - "localheinz/php-cs-fixer-config": "~1.11.0" + "localheinz/php-cs-fixer-config": "~1.0.0|~1.11.0" }, "autoload": { "psr-4": { @@ -126,7 +128,7 @@ public function testNormalizeNormalizes() "localheinz/json-printer": "^1.0.0" }, "require-dev": { - "localheinz/php-cs-fixer-config": "~1.11.0", + "localheinz/php-cs-fixer-config": "~1.0.0 || ~1.11.0", "localheinz/test-util": "0.6.1", "phpunit/phpunit": "^6.5.5" }, diff --git a/test/Unit/Normalizer/VersionOrConstraintNormalizerTest.php b/test/Unit/Normalizer/VersionOrConstraintNormalizerTest.php new file mode 100644 index 00000000..1265ace2 --- /dev/null +++ b/test/Unit/Normalizer/VersionOrConstraintNormalizerTest.php @@ -0,0 +1,106 @@ +assertSame($json, $normalizer->normalize($json)); + } + + /** + * @dataProvider providerProperty + * + * @param string $property + */ + public function testNormalizeIgnoresEmptyPackageHash(string $property) + { + $json = <<assertSame(\json_encode(\json_decode($json)), $normalizer->normalize($json)); + } + + /** + * @dataProvider providerProperty + * + * @param string $property + */ + public function testNormalizeReplacesSinglePipeWithDoublePipeIfPropertyExists(string $property) + { + $json = <<assertSame(\json_encode(\json_decode($normalized)), $normalizer->normalize($json)); + } + + public function providerProperty(): \Generator + { + $values = [ + 'conflict', + 'provide', + 'replaces', + 'require', + 'require-dev', + ]; + + foreach ($values as $value) { + yield $value => [ + $value, + ]; + } + } +}