Skip to content
Snippets Groups Projects
Commit 819e8ed2 authored by Duro Arezina's avatar Duro Arezina Committed by Duro Arezina
Browse files

Issue #3177450 by devad: Add warnings about unsupported autoload types and...

Issue #3177450 by devad: Add warnings about unsupported autoload types and improve PSR types support
parent 7772159f
No related branches found
Tags 8.x-1.1
No related merge requests found
......@@ -72,7 +72,7 @@ class PackageController implements ContainerInjectionInterface {
'#theme' => 'table',
'#header' => [
'package' => $this->t('Package'),
'version' => $this->t('Version'),
'version' => $this->t('Type, Version'),
'required_by' => $this->t('Required by'),
'status' => $this->t('Status'),
],
......@@ -81,7 +81,12 @@ class PackageController implements ContainerInjectionInterface {
],
];
foreach ($this->packageManager->getPackages() as $package_name => $package) {
if (!$package['installed']) {
if ($package['autoload_type'] == 'classmap' || $package['autoload_type'] == 'files') {
$package['description'] = $this->t('<strong>Warning! @autoload_type autoload type libraries are not supported by Ludwig yet.</strong>', [
'@autoload_type' => strtoupper($package['autoload_type']),
]);
}
elseif (!$package['installed']) {
$package['description'] = $this->t('@download the library and place it in @path', [
'@download' => Link::fromTextAndUrl($this->t('Download'), Url::fromUri($package['download_url']))->toString(),
'@path' => $package['path'],
......@@ -122,7 +127,7 @@ class PackageController implements ContainerInjectionInterface {
'package' => [
'data' => $package_column,
],
'version' => $package['version'],
'version' => strtoupper($package['autoload_type']) . ', ' . $package['version'],
'required_by' => $required_by,
'status' => $package['installed'] ? $this->t('Installed') : $this->t('Missing'),
],
......
......@@ -22,10 +22,15 @@ class LudwigServiceProvider extends ServiceProviderBase {
$namespaces = $container->getParameter('container.namespaces');
foreach ($package_manager->getPackages() as $package_name => $package) {
if ($package['installed']) {
$namespace = $package['namespace'];
$namespaces[$namespace] = $package['path'];
if (!empty($package['src_dir'])) {
$namespaces[$namespace] .= '/' . $package['src_dir'];
if ($package['autoload_type'] == 'classmap' || $package['autoload_type'] == 'files') {
// @todo: Add support for 'classmap' and 'files' autoload types.
}
else {
$namespace = $package['namespace'];
$namespaces[$namespace] = $package['path'];
if (!empty($package['src_dir'])) {
$namespaces[$namespace] .= '/' . $package['src_dir'];
}
}
}
}
......
......@@ -54,44 +54,89 @@ class PackageManager implements PackageManagerInterface {
];
foreach ($config['require'] as $package_name => $package_data) {
$namespace = '';
$src_dir = '';
$package_name_static = $package_name;
$package_path = $extension_path . '/lib/' . str_replace('/', '-', $package_name) . '/' . $package_data['version'];
$package = $this->jsonRead($this->root . '/' . $package_path . '/composer.json');
$description = !empty($package['description']) ? $package['description'] : '';
$homepage = !empty($package['homepage']) ? $package['homepage'] : '';
$autoload_key = isset($package['autoload']['psr-4']) ? 'psr-4' : 'psr-0';
if (!empty($package['autoload'][$autoload_key])) {
$autoload = $package['autoload'][$autoload_key];
$package_namespaces = array_keys($autoload);
$namespace = reset($package_namespaces);
$src_dir = $autoload[$namespace];
$src_dir = rtrim($src_dir, './');
// Autoloading fails if the namespace ends with a backslash.
$namespace = trim($namespace, '\\');
}
if ($autoload_key == 'psr-0' && !empty($namespace)) {
// Core only assumes that LudwigServiceProvider is adding PSR-4
// paths, each PSR-0 path needs to be converted in order to work.
if (!empty($src_dir)) {
$src_dir .= '/';
if (!empty($package['autoload'])) {
// Iterate through all autoload types.
$autoload_types = array_keys($package['autoload']);
count($autoload_types) > 1 ? $multi = TRUE : $multi = FALSE;
foreach ($autoload_types as $autoload_type) {
if (!empty($package['autoload'][$autoload_type])) {
if ($autoload_type == 'files' || $autoload_type == 'classmap') {
$autoload = $package['autoload'];
$package_namespaces = [$autoload_type];
}
else {
$autoload = $package['autoload'][$autoload_type];
$package_namespaces = array_keys($autoload);
}
if (count($package_namespaces) > 1) {
$multi = TRUE;
}
// Iterate through all resources inside this autoload type.
foreach ($package_namespaces as $namespace) {
$src_dir = $autoload[$namespace];
// Support for both single path (string) and multiple
// paths (array) inside one resource.
$srcdir = [];
is_array($src_dir) ? $srcdir = $src_dir : $srcdir[0] = $src_dir;
if (count($srcdir) > 1) {
$multi = TRUE;
}
foreach ($srcdir as $src_dir) {
$src_dir = rtrim($src_dir, './');
if ($multi) {
$package_name = $package_name_static . ' | ' . $src_dir;
}
// Autoloading fails if the namespace ends with a backslash.
$namespace = trim($namespace, '\\');
// Core only assumes that LudwigServiceProvider is adding
// PSR-4 paths, each PSR-0 path needs to be converted
// in order to work.
if ($autoload_type == 'psr-0' && !empty($namespace)) {
if (!empty($src_dir)) {
$src_dir .= '/';
}
$src_dir .= str_replace('\\', '/', $namespace);
}
$packages[$package_name] = [
'name' => $package_name,
'version' => $package_data['version'],
'description' => $description,
'homepage' => $homepage,
'provider' => $extension_name,
'provider_path' => $extension_path,
'download_url' => $package_data['url'],
'path' => $package_path,
'namespace' => $namespace,
'src_dir' => $src_dir,
'installed' => !empty($namespace),
'autoload_type' => $autoload_type,
];
}
}
}
}
$src_dir .= str_replace('\\', '/', $namespace);
}
$packages[$package_name] = [
'name' => $package_name,
'version' => $package_data['version'],
'description' => $description,
'homepage' => $homepage,
'provider' => $extension_name,
'provider_path' => $extension_path,
'download_url' => $package_data['url'],
'path' => $package_path,
'namespace' => $namespace,
'src_dir' => $src_dir,
'installed' => !empty($namespace),
];
else {
$packages[$package_name] = [
'name' => $package_name,
'version' => $package_data['version'],
'description' => $description,
'homepage' => $homepage,
'provider' => $extension_name,
'provider_path' => $extension_path,
'download_url' => $package_data['url'],
'path' => $package_path,
'namespace' => '',
'src_dir' => '',
'installed' => FALSE,
'autoload_type' => 'unknown',
];
}
}
}
......@@ -120,5 +165,4 @@ class PackageManager implements PackageManagerInterface {
return $data;
}
}
......@@ -123,6 +123,7 @@ namespace Drupal\Tests\ludwig\Unit {
'namespace' => '',
'src_dir' => '',
'installed' => FALSE,
'autoload_type' => 'unknown',
],
'symfony/config' => [
'name' => 'symfony/config',
......@@ -136,6 +137,7 @@ namespace Drupal\Tests\ludwig\Unit {
'namespace' => 'Symfony\\Component\\Config',
'src_dir' => '',
'installed' => TRUE,
'autoload_type' => 'psr-4',
],
'symfony/intl' => [
'name' => 'symfony/intl',
......@@ -149,6 +151,7 @@ namespace Drupal\Tests\ludwig\Unit {
'namespace' => '',
'src_dir' => '',
'installed' => FALSE,
'autoload_type' => 'unknown',
],
];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment