From 10d987c977d018e0d2d8391ece9a2982a1c8f0f4 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 18 Jun 2015 13:51:38 +0200 Subject: [PATCH] Validate composer.json when composer binary is available fixes #43 --- CHANGELOG.md | 4 ++++ src/Clue/PharComposer/PharComposer.php | 22 +++++++++++++++++++--- tests/PharComposerTest.php | 8 ++++++++ tests/fixtures/invalid_composer.json | 5 +++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/invalid_composer.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 116b455..5a44b2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ you spot any mistakes. * Feature: Can now be installed as a `require-dev` composer dependency and supports running as `./vendor/bin/phar-composer`. ([#36](https://github.com/clue/phar-composer/pull/36), thanks @radford) +* Feature: When composer or composer.phar is available in CLI `.json` files + passed to `PharComposer` are validated. In case of validation errors a + RuntimeException will be thrown. + ([#36](https://github.com/clue/phar-composer/pull/48), thanks @staabm) ## 0.5.0 (2014-07-10) diff --git a/src/Clue/PharComposer/PharComposer.php b/src/Clue/PharComposer/PharComposer.php index b8279e7..499c5bd 100644 --- a/src/Clue/PharComposer/PharComposer.php +++ b/src/Clue/PharComposer/PharComposer.php @@ -2,13 +2,16 @@ namespace Clue\PharComposer; -use Symfony\Component\Finder\Finder; - -use Herrera\Box\StubGenerator; use UnexpectedValueException; use InvalidArgumentException; use RuntimeException; + +use Herrera\Box\StubGenerator; + +use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\SplFileInfo; +use Symfony\Component\Process\ExecutableFinder; +use Symfony\Component\Process\Process; class PharComposer { @@ -247,6 +250,19 @@ public function setStep($step) private function loadJson($path) { + $executableFinder = new ExecutableFinder(); + foreach (['composer', 'composer.phar'] as $candidateName) { + if ($composerPath = $executableFinder->find($candidateName, null, array(getcwd()))) { + $process = new Process($candidateName . ' validate '. escapeshellarg($path)); + $process->run(); + + if (!$process->isSuccessful()) { + throw new \RuntimeException($process->getErrorOutput()); + } + break; + } + } + $ret = json_decode(file_get_contents($path), true); if ($ret === null) { var_dump(json_last_error(), JSON_ERROR_SYNTAX); diff --git a/tests/PharComposerTest.php b/tests/PharComposerTest.php index 899e656..8273b4e 100644 --- a/tests/PharComposerTest.php +++ b/tests/PharComposerTest.php @@ -35,6 +35,14 @@ public function testSetters(PharComposer $pharcomposer) return $pharcomposer; } + /** + * @expectedException \RuntimeException + */ + public function testComposerJsonValidation() + { + new PharComposer(__DIR__ . '/fixtures/invalid_composer.json'); + } + private function getPathProjectAbsolute($path) { return realpath(__DIR__ . '/../' . $path); diff --git a/tests/fixtures/invalid_composer.json b/tests/fixtures/invalid_composer.json new file mode 100644 index 0000000..ffbb646 --- /dev/null +++ b/tests/fixtures/invalid_composer.json @@ -0,0 +1,5 @@ +{ + "name": "clue/phar-composer", + "description": "This file contains invalid json", + BAM +}