PageRenderTime 23ms CodeModel.GetById 42ms RepoModel.GetById 4ms app.codeStats 0ms

/vendor/symfony/maker-bundle/src/DependencyBuilder.php

https://bitbucket.org/strudlik/gitagent
PHP | 139 lines | 90 code | 19 blank | 30 comment | 11 complexity | 46935b6d942cac1336f42f6b03d5efb4 MD5 | raw file
Possible License(s): LGPL-2.1, Unlicense, BSD-3-Clause
  1. <?php
  2. /*
  3. * This file is part of the Symfony MakerBundle package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\MakerBundle;
  11. final class DependencyBuilder
  12. {
  13. private $dependencies = [];
  14. private $devDependencies = [];
  15. /**
  16. * Add a dependency that will be reported if the given class is missing.
  17. *
  18. * If the dependency is *optional*, then it will only be reported to
  19. * the user if other required dependencies are missing. An example
  20. * is the "validator" when trying to work with forms.
  21. */
  22. public function addClassDependency(string $class, string $package, bool $required = true, bool $devDependency = false)
  23. {
  24. if ($devDependency) {
  25. $this->devDependencies[] = [
  26. 'class' => $class,
  27. 'name' => $package,
  28. 'required' => $required,
  29. ];
  30. } else {
  31. $this->dependencies[] = [
  32. 'class' => $class,
  33. 'name' => $package,
  34. 'required' => $required,
  35. ];
  36. }
  37. }
  38. /**
  39. * @internal
  40. */
  41. public function getMissingDependencies(): array
  42. {
  43. return $this->calculateMissingDependencies($this->dependencies);
  44. }
  45. /**
  46. * @internal
  47. */
  48. public function getMissingDevDependencies(): array
  49. {
  50. return $this->calculateMissingDependencies($this->devDependencies);
  51. }
  52. /**
  53. * @internal
  54. */
  55. public function getAllRequiredDependencies(): array
  56. {
  57. return $this->getRequiredDependencyNames($this->dependencies);
  58. }
  59. /**
  60. * @internal
  61. */
  62. public function getAllRequiredDevDependencies(): array
  63. {
  64. return $this->getRequiredDependencyNames($this->devDependencies);
  65. }
  66. /**
  67. * @internal
  68. */
  69. public function getMissingPackagesMessage(string $commandName): string
  70. {
  71. $packages = $this->getMissingDependencies();
  72. $packagesDev = $this->getMissingDevDependencies();
  73. if (empty($packages) && empty($packagesDev)) {
  74. return '';
  75. }
  76. $packagesCount = count($packages) + count($packagesDev);
  77. $message = sprintf(
  78. "Missing package%s: to use the %s command, run:\n",
  79. $packagesCount > 1 ? 's' : '',
  80. $commandName
  81. );
  82. if (!empty($packages)) {
  83. $message .= sprintf("\ncomposer require %s", implode(' ', $packages));
  84. }
  85. if (!empty($packagesDev)) {
  86. $message .= sprintf("\ncomposer require %s --dev", implode(' ', $packagesDev));
  87. }
  88. return $message;
  89. }
  90. private function getRequiredDependencyNames(array $dependencies)
  91. {
  92. $packages = [];
  93. foreach ($dependencies as $package) {
  94. if (!$package['required']) {
  95. continue;
  96. }
  97. $packages[] = $package['name'];
  98. }
  99. return array_unique($packages);
  100. }
  101. private function calculateMissingDependencies(array $dependencies)
  102. {
  103. $missingPackages = [];
  104. $missingOptionalPackages = [];
  105. foreach ($dependencies as $package) {
  106. if (class_exists($package['class'])) {
  107. continue;
  108. }
  109. if (true === $package['required']) {
  110. $missingPackages[] = $package['name'];
  111. } else {
  112. $missingOptionalPackages[] = $package['name'];
  113. }
  114. }
  115. if (empty($missingPackages)) {
  116. return [];
  117. }
  118. return array_unique(array_merge($missingPackages, $missingOptionalPackages));
  119. }
  120. }