From ad8e52df34b2e78bdacfffecc9fe8edf41843342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harold=20Ju=C3=A1rez?= Date: Thu, 7 Nov 2019 14:15:27 -0600 Subject: [PATCH] Add custom installer for drupal-console-library type (#22) --- composer.json | 1 + src/DrupalConsoleInstaller.php | 19 +++++++++ src/Extender.php | 5 +++ src/Installer.php | 71 ++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 src/DrupalConsoleInstaller.php create mode 100644 src/Installer.php diff --git a/composer.json b/composer.json index 1aabc9f..c9e4b5d 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ }, "require": { "composer-plugin-api": "^1.0", + "composer/installers": "^1.2", "symfony/yaml": "~2.7|~3.0", "symfony/finder": "~2.7|~3.0" }, diff --git a/src/DrupalConsoleInstaller.php b/src/DrupalConsoleInstaller.php new file mode 100644 index 0000000..b410b5e --- /dev/null +++ b/src/DrupalConsoleInstaller.php @@ -0,0 +1,19 @@ + 'vendor/drupal/{$name}/', + ); +} diff --git a/src/Extender.php b/src/Extender.php index 186f321..fb1438c 100644 --- a/src/Extender.php +++ b/src/Extender.php @@ -38,6 +38,11 @@ public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; + + $installer = new Installer($io, $composer); + + $composer->getInstallationManager()->addInstaller($installer); + } /** diff --git a/src/Installer.php b/src/Installer.php new file mode 100644 index 0000000..6fa1bd8 --- /dev/null +++ b/src/Installer.php @@ -0,0 +1,71 @@ + 'DrupalConsoleInstaller' + ); + + /** + * {@inheritDoc} + */ + public function getInstallPath(PackageInterface $package) + { + $type = $package->getType(); + $frameworkType = $this->findFrameworkType($type); + + if ($frameworkType === false) { + throw new \InvalidArgumentException( + 'Sorry the package type of this package is not yet supported.' + ); + } + + $class = 'Drupal\\Console\\Composer\\Plugin\\' . $this->supportedTypes[$frameworkType]; + $installer = new $class($package, $this->composer, $this->getIO()); + + return $installer->getInstallPath($package, $frameworkType); + } + + /** + * Get the second part of the regular expression to check for support of a + * package type + * + * @param string $frameworkType + * @return string + */ + protected function getLocationPattern($frameworkType) + { + $pattern = false; + if (!empty($this->supportedTypes[$frameworkType])) { + $frameworkClass = 'Drupal\\Console\\Composer\\Plugin\\' . $this->supportedTypes[$frameworkType]; + /** @var BaseInstaller $framework */ + $framework = new $frameworkClass(null, $this->composer, $this->getIO()); + $locations = array_keys($framework->getLocations()); + $pattern = $locations ? '(' . implode('|', $locations) . ')' : false; + } + + return $pattern ? : '(\w+)'; + } + + /** + * Get I/O object + * + * @return IOInterface + */ + private function getIO() + { + return $this->io; + } +}