PluginProbe
Code Snippets / 3.0.0
Code Snippets v3.0.0
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / trunk / vendor / composer / installers / src / Composer / Installers / BaseInstaller.php

BaseInstaller.php in Code Snippets 3.0.0, at trunk/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php

138 lines 4.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Composer\Installers;
3
4 use Composer\IO\IOInterface;
5 use Composer\Composer;
6 use Composer\Package\PackageInterface;
7
8 abstract class BaseInstaller
9 {
10 protected $locations = array();
11 protected $composer;
12 protected $package;
13 protected $io;
14
15 /**
16 * Initializes base installer.
17 *
18 * @param PackageInterface $package
19 * @param Composer $composer
20 * @param IOInterface $io
21 */
22 public function __construct(PackageInterface $package = null, Composer $composer = null, IOInterface $io = null)
23 {
24 $this->composer = $composer;
25 $this->package = $package;
26 $this->io = $io;
27 }
28
29 /**
30 * Return the install path based on package type.
31 *
32 * @param PackageInterface $package
33 * @param string $frameworkType
34 * @return string
35 */
36 public function getInstallPath(PackageInterface $package, $frameworkType = '')
37 {
38 $type = $this->package->getType();
39
40 $prettyName = $this->package->getPrettyName();
41 if (strpos($prettyName, '/') !== false) {
42 list($vendor, $name) = explode('/', $prettyName);
43 } else {
44 $vendor = '';
45 $name = $prettyName;
46 }
47
48 $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type'));
49
50 $extra = $package->getExtra();
51 if (!empty($extra['installer-name'])) {
52 $availableVars['name'] = $extra['installer-name'];
53 }
54
55 if ($this->composer->getPackage()) {
56 $extra = $this->composer->getPackage()->getExtra();
57 if (!empty($extra['installer-paths'])) {
58 $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor);
59 if ($customPath !== false) {
60 return $this->templatePath($customPath, $availableVars);
61 }
62 }
63 }
64
65 $packageType = substr($type, strlen($frameworkType) + 1);
66 $locations = $this->getLocations();
67 if (!isset($locations[$packageType])) {
68 throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type));
69 }
70
71 return $this->templatePath($locations[$packageType], $availableVars);
72 }
73
74 /**
75 * For an installer to override to modify the vars per installer.
76 *
77 * @param array<string, string> $vars This will normally receive array{name: string, vendor: string, type: string}
78 * @return array<string, string>
79 */
80 public function inflectPackageVars($vars)
81 {
82 return $vars;
83 }
84
85 /**
86 * Gets the installer's locations
87 *
88 * @return array<string, string> map of package types => install path
89 */
90 public function getLocations()
91 {
92 return $this->locations;
93 }
94
95 /**
96 * Replace vars in a path
97 *
98 * @param string $path
99 * @param array<string, string> $vars
100 * @return string
101 */
102 protected function templatePath($path, array $vars = array())
103 {
104 if (strpos($path, '{') !== false) {
105 extract($vars);
106 preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches);
107 if (!empty($matches[1])) {
108 foreach ($matches[1] as $var) {
109 $path = str_replace('{$' . $var . '}', $$var, $path);
110 }
111 }
112 }
113
114 return $path;
115 }
116
117 /**
118 * Search through a passed paths array for a custom install path.
119 *
120 * @param array $paths
121 * @param string $name
122 * @param string $type
123 * @param string $vendor = NULL
124 * @return string|false
125 */
126 protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL)
127 {
128 foreach ($paths as $path => $names) {
129 $names = (array) $names;
130 if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) {
131 return $path;
132 }
133 }
134
135 return false;
136 }
137 }
138