Yaffs site version 1.1
[yaffs-website] / vendor / composer / installers / src / Composer / Installers / BaseInstaller.php
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 $vars
78      * @return array
79      */
80     public function inflectPackageVars($vars)
81     {
82         return $vars;
83     }
84
85     /**
86      * Gets the installer's locations
87      *
88      * @return array
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  $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
125      */
126     protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL)
127     {
128         foreach ($paths as $path => $names) {
129             if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) {
130                 return $path;
131             }
132         }
133
134         return false;
135     }
136 }