145 lines
4.0 KiB
PHP
145 lines
4.0 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony MakerBundle package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Bundle\MakerBundle;
|
|
|
|
final class DependencyBuilder
|
|
{
|
|
private array $dependencies = [];
|
|
private array $devDependencies = [];
|
|
|
|
/**
|
|
* Add a dependency that will be reported if the given class is missing.
|
|
*
|
|
* If the dependency is *optional*, then it will only be reported to
|
|
* the user if other required dependencies are missing. An example
|
|
* is the "validator" when trying to work with forms.
|
|
*/
|
|
public function addClassDependency(string $class, string $package, bool $required = true, bool $devDependency = false): void
|
|
{
|
|
if ($devDependency) {
|
|
$this->devDependencies[] = [
|
|
'class' => $class,
|
|
'name' => $package,
|
|
'required' => $required,
|
|
];
|
|
} else {
|
|
$this->dependencies[] = [
|
|
'class' => $class,
|
|
'name' => $package,
|
|
'required' => $required,
|
|
];
|
|
}
|
|
}
|
|
|
|
public function requirePHP71(): void
|
|
{
|
|
trigger_deprecation('symfony/maker-bundle', 'v1.44.0', 'requirePHP71() is deprecated and will be removed in a future version.');
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
public function getMissingDependencies(): array
|
|
{
|
|
return $this->calculateMissingDependencies($this->dependencies);
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
public function getMissingDevDependencies(): array
|
|
{
|
|
return $this->calculateMissingDependencies($this->devDependencies);
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
public function getAllRequiredDependencies(): array
|
|
{
|
|
return $this->getRequiredDependencyNames($this->dependencies);
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
public function getAllRequiredDevDependencies(): array
|
|
{
|
|
return $this->getRequiredDependencyNames($this->devDependencies);
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
public function getMissingPackagesMessage(string $commandName, $message = null): string
|
|
{
|
|
$packages = $this->getMissingDependencies();
|
|
$packagesDev = $this->getMissingDevDependencies();
|
|
|
|
if (empty($packages) && empty($packagesDev)) {
|
|
return '';
|
|
}
|
|
|
|
$packagesCount = \count($packages) + \count($packagesDev);
|
|
|
|
$message = \sprintf(
|
|
"Missing package%s: %s, run:\n",
|
|
$packagesCount > 1 ? 's' : '',
|
|
$message ?: \sprintf('to use the %s command', $commandName)
|
|
);
|
|
|
|
if (!empty($packages)) {
|
|
$message .= \sprintf("\ncomposer require %s", implode(' ', $packages));
|
|
}
|
|
|
|
if (!empty($packagesDev)) {
|
|
$message .= \sprintf("\ncomposer require %s --dev", implode(' ', $packagesDev));
|
|
}
|
|
|
|
return $message;
|
|
}
|
|
|
|
private function getRequiredDependencyNames(array $dependencies): array
|
|
{
|
|
$packages = [];
|
|
foreach ($dependencies as $package) {
|
|
if (!$package['required']) {
|
|
continue;
|
|
}
|
|
$packages[] = $package['name'];
|
|
}
|
|
|
|
return array_unique($packages);
|
|
}
|
|
|
|
private function calculateMissingDependencies(array $dependencies): array
|
|
{
|
|
$missingPackages = [];
|
|
$missingOptionalPackages = [];
|
|
foreach ($dependencies as $package) {
|
|
if (class_exists($package['class']) || interface_exists($package['class']) || trait_exists($package['class'])) {
|
|
continue;
|
|
}
|
|
if (true === $package['required']) {
|
|
$missingPackages[] = $package['name'];
|
|
} else {
|
|
$missingOptionalPackages[] = $package['name'];
|
|
}
|
|
}
|
|
if (empty($missingPackages)) {
|
|
return [];
|
|
}
|
|
|
|
return array_unique([...$missingPackages, ...$missingOptionalPackages]);
|
|
}
|
|
}
|