ArrayLoader.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Package\Loader;
  12. use Composer\Package;
  13. use Composer\Repository\RepositoryManager;
  14. /**
  15. * @author Konstantin Kudryashiv <ever.zet@gmail.com>
  16. * @author Jordi Boggiano <j.boggiano@seld.be>
  17. */
  18. class ArrayLoader
  19. {
  20. protected $supportedLinkTypes = array(
  21. 'require' => 'requires',
  22. 'conflict' => 'conflicts',
  23. 'provide' => 'provides',
  24. 'replace' => 'replaces',
  25. 'recommend' => 'recommends',
  26. 'suggest' => 'suggests',
  27. );
  28. protected $versionParser;
  29. private $manager;
  30. public function __construct(RepositoryManager $manager, $parser = null)
  31. {
  32. $this->manager = $manager;
  33. $this->versionParser = $parser;
  34. if (!$parser) {
  35. $this->versionParser = new Package\Version\VersionParser;
  36. }
  37. }
  38. public function load($config)
  39. {
  40. $prettyVersion = isset($config['version']) ? $config['version'] : '0.0.0';
  41. $version = $this->versionParser->normalize($prettyVersion);
  42. $package = new Package\MemoryPackage(isset($config['name']) ? $config['name'] : '__app__', $version, $prettyVersion);
  43. $package->setType(isset($config['type']) ? $config['type'] : 'library');
  44. if (isset($config['target-dir'])) {
  45. $package->setTargetDir($config['target-dir']);
  46. }
  47. if (isset($config['repositories'])) {
  48. $repositories = array();
  49. foreach ($config['repositories'] as $repoName => $repo) {
  50. if (false === $repo && 'packagist' === $repoName) {
  51. continue;
  52. }
  53. if (!is_array($repo)) {
  54. throw new \UnexpectedValueException('Repository '.$repoName.' in '.$package->getPrettyName().' '.$package->getVersion().' should be an array, '.gettype($repo).' given');
  55. }
  56. $repository = $this->manager->createRepository(key($repo), current($repo));
  57. $this->manager->addRepository($repository);
  58. }
  59. $package->setRepositories($config['repositories']);
  60. }
  61. if (isset($config['extra'])) {
  62. $package->setExtra($config['extra']);
  63. }
  64. if (isset($config['license'])) {
  65. $package->setLicense($config['license']);
  66. }
  67. if (isset($config['installation-source'])) {
  68. $package->setInstallationSource($config['installation-source']);
  69. }
  70. if (isset($config['source'])) {
  71. if (!isset($config['source']['type']) || !isset($config['source']['url'])) {
  72. throw new \UnexpectedValueException(sprintf(
  73. "package source should be specified as {\"type\": ..., \"url\": ...},\n%s given",
  74. json_encode($config['source'])
  75. ));
  76. }
  77. $package->setSourceType($config['source']['type']);
  78. $package->setSourceUrl($config['source']['url']);
  79. $package->setSourceReference($config['source']['reference']);
  80. }
  81. if (isset($config['dist'])) {
  82. if (!isset($config['dist']['type'])
  83. || !isset($config['dist']['url'])) {
  84. throw new \UnexpectedValueException(sprintf(
  85. "package dist should be specified as ".
  86. "{\"type\": ..., \"url\": ..., \"reference\": ..., \"shasum\": ...},\n%s given",
  87. json_encode($config['dist'])
  88. ));
  89. }
  90. $package->setDistType($config['dist']['type']);
  91. $package->setDistUrl($config['dist']['url']);
  92. $package->setDistReference(isset($config['dist']['reference']) ? $config['dist']['reference'] : null);
  93. $package->setDistSha1Checksum(isset($config['dist']['shasum']) ? $config['dist']['shasum'] : null);
  94. }
  95. foreach ($this->supportedLinkTypes as $type => $description) {
  96. if (isset($config[$type])) {
  97. $method = 'set'.ucfirst($description);
  98. $package->{$method}(
  99. $this->loadLinksFromConfig($package->getName(), $description, $config[$type])
  100. );
  101. }
  102. }
  103. if (isset($config['autoload'])) {
  104. $package->setAutoload($config['autoload']);
  105. }
  106. return $package;
  107. }
  108. private function loadLinksFromConfig($srcPackageName, $description, array $linksSpecs)
  109. {
  110. $links = array();
  111. foreach ($linksSpecs as $packageName => $constraint) {
  112. $name = strtolower($packageName);
  113. $constraint = $this->versionParser->parseConstraints($constraint);
  114. $links[] = new Package\Link($srcPackageName, $packageName, $constraint, $description);
  115. }
  116. return $links;
  117. }
  118. }