From 4e769e11000ad313f5abe1dfa4cdf9665d78d223 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Mon, 1 Oct 2012 19:49:27 +0200 Subject: [PATCH] moved some code to a dedicated class --- src/Composer/Command/ValidateCommand.php | 69 +------------- src/Composer/Util/ConfigValidator.php | 114 +++++++++++++++++++++++ 2 files changed, 117 insertions(+), 66 deletions(-) create mode 100644 src/Composer/Util/ConfigValidator.php diff --git a/src/Composer/Command/ValidateCommand.php b/src/Composer/Command/ValidateCommand.php index 4aaa2e24e..2f2e9b9c4 100644 --- a/src/Composer/Command/ValidateCommand.php +++ b/src/Composer/Command/ValidateCommand.php @@ -12,6 +12,7 @@ namespace Composer\Command; +use Composer\Util\ConfigValidator; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; @@ -69,72 +70,8 @@ EOT return 1; } - $errors = array(); - $publishErrors = array(); - $warnings = array(); - - // validate json schema - $laxValid = false; - $valid = false; - try { - $json = new JsonFile($file, new RemoteFilesystem($this->getIO())); - $manifest = $json->read(); - - $json->validateSchema(JsonFile::LAX_SCHEMA); - $laxValid = true; - $json->validateSchema(); - $valid = true; - } catch (JsonValidationException $e) { - foreach ($e->getErrors() as $message) { - if ($laxValid) { - $publishErrors[] = 'Publish Error: ' . $message . ''; - } else { - $errors[] = '' . $message . ''; - } - } - } catch (\Exception $e) { - $output->writeln('' . $e->getMessage() . ''); - - return 1; - } - - // validate actual data - if (!empty($manifest['license'])) { - $licenseValidator = new SpdxLicenseIdentifier(); - if (!$licenseValidator->validate($manifest['license'])) { - $warnings[] = sprintf( - 'License %s is not a valid SPDX license identifier, see http://www.spdx.org/licenses/ if you use an open license', - json_encode($manifest['license']) - ); - } - } else { - $warnings[] = 'No license specified, it is recommended to do so'; - } - - if (!empty($manifest['name']) && preg_match('{[A-Z]}', $manifest['name'])) { - $suggestName = preg_replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '\\1\\3-\\2\\4', $manifest['name']); - $suggestName = strtolower($suggestName); - - $warnings[] = sprintf( - 'Name "%s" does not match the best practice (e.g. lower-cased/with-dashes). We suggest using "%s" instead. As such you will not be able to submit it to Packagist.', - $manifest['name'], - $suggestName - ); - } - - // TODO validate package repositories' packages using the same technique as below - try { - $loader = new ValidatingArrayLoader(new ArrayLoader(), false); - if (!isset($manifest['version'])) { - $manifest['version'] = '1.0.0'; - } - if (!isset($manifest['name'])) { - $manifest['name'] = 'dummy/dummy'; - } - $loader->load($manifest); - } catch (\Exception $e) { - $errors = array_merge($errors, explode("\n", $e->getMessage())); - } + $validator = new ConfigValidator($this->getIO()); + list($errors, $publishErrors, $warnings) = $validator->validate($file); // output errors/warnings if (!$errors && !$publishErrors && !$warnings) { diff --git a/src/Composer/Util/ConfigValidator.php b/src/Composer/Util/ConfigValidator.php new file mode 100644 index 000000000..8fd363138 --- /dev/null +++ b/src/Composer/Util/ConfigValidator.php @@ -0,0 +1,114 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Util; + +use Composer\Package\Loader\ArrayLoader; +use Composer\Package\Loader\ValidatingArrayLoader; +use Composer\Json\JsonValidationException; +use Composer\IO\IOInterface; +use Composer\Json\JsonFile; + +/** + * Validates a composer configuration. + * + * @author Robert Schönthal + * @author Jordi Boggiano + */ +class ConfigValidator +{ + private $io; + + public function __construct(IOInterface $io) + { + $this->io = $io; + } + + /** + * Validates the config, and returns the result. + * + * @param string $file The path to the file + * + * @return array a triple containing the errors, publishable errors, and warnings + */ + public function validate($file) + { + $errors = array(); + $publishErrors = array(); + $warnings = array(); + + // validate json schema + $laxValid = false; + $valid = false; + try { + $json = new JsonFile($file, new RemoteFilesystem($this->io)); + $manifest = $json->read(); + + $json->validateSchema(JsonFile::LAX_SCHEMA); + $laxValid = true; + $json->validateSchema(); + $valid = true; + } catch (JsonValidationException $e) { + foreach ($e->getErrors() as $message) { + if ($laxValid) { + $publishErrors[] = 'Publish Error: ' . $message . ''; + } else { + $errors[] = '' . $message . ''; + } + } + } catch (\Exception $e) { + $output->writeln('' . $e->getMessage() . ''); + + return 1; + } + + // validate actual data + if (!empty($manifest['license'])) { + $licenseValidator = new SpdxLicenseIdentifier(); + if (!$licenseValidator->validate($manifest['license'])) { + $warnings[] = sprintf( + 'License %s is not a valid SPDX license identifier, see http://www.spdx.org/licenses/ if you use an open license', + json_encode($manifest['license']) + ); + } + } else { + $warnings[] = 'No license specified, it is recommended to do so'; + } + + if (!empty($manifest['name']) && preg_match('{[A-Z]}', $manifest['name'])) { + $suggestName = preg_replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '\\1\\3-\\2\\4', $manifest['name']); + $suggestName = strtolower($suggestName); + + $warnings[] = sprintf( + 'Name "%s" does not match the best practice (e.g. lower-cased/with-dashes). We suggest using "%s" instead. As such you will not be able to submit it to Packagist.', + $manifest['name'], + $suggestName + ); + } + + // TODO validate package repositories' packages using the same technique as below + try { + $loader = new ValidatingArrayLoader(new ArrayLoader(), false); + if (!isset($manifest['version'])) { + $manifest['version'] = '1.0.0'; + } + if (!isset($manifest['name'])) { + $manifest['name'] = 'dummy/dummy'; + } + $loader->load($manifest); + } catch (\Exception $e) { + $errors = array_merge($errors, explode("\n", $e->getMessage())); + } + + return array($errors, $publishErrors, $warnings); + } +} \ No newline at end of file