Passed
Pull Request — master (#54)
by Alexander
12:39
created

AliasesCollector::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
dl 0
loc 3
c 1
b 0
f 0
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Composer\Config\Package;
6
7
use Composer\Util\Filesystem;
8
use Yiisoft\Composer\Config\Package;
9
10
class AliasesCollector
11
{
12
    private Filesystem $filesystem;
13
14
    public function __construct(Filesystem $filesystem)
15
    {
16
        $this->filesystem = $filesystem;
17
    }
18
19
    /**
20
     * Collects package aliases.
21
     *
22
     * @param Package $package
23
     * @return array collected aliases
24
     */
25
    public function collect(Package $package): array
26
    {
27
        $aliases = array_merge(
28
            $this->prepareAliases($package, 'psr-0', false),
29
            $this->prepareAliases($package, 'psr-4', false)
30
        );
31
        if ($package->isRoot()) {
32
            $aliases = array_merge(
33
                $aliases,
34
                $this->prepareAliases($package, 'psr-0', true),
35
                $this->prepareAliases($package, 'psr-4', true)
36
            );
37
        }
38
39
        return $aliases;
40
    }
41
42
    /**
43
     * Prepare aliases.
44
     *
45
     * @param Package $package
46
     * @param string $psr 'psr-0' or 'psr-4'
47
     * @param bool $dev
48
     * @return array
49
     */
50
    private function prepareAliases(Package $package, string $psr, bool $dev): array
51
    {
52
        $autoload = $dev ? $package->getDevAutoload() : $package->getAutoload();
53
        if (empty($autoload[$psr])) {
54
            return [];
55
        }
56
57
        $aliases = [];
58
        foreach ($autoload[$psr] as $name => $path) {
59
            if (is_array($path)) {
60
                // ignore psr-4 autoload specifications with multiple search paths
61
                // we can not convert them into aliases as they are ambiguous
62
                continue;
63
            }
64
            $name = str_replace('\\', '/', trim($name, '\\'));
65
            $path = $this->preparePath($package, $path);
66
            if ('psr-0' === $psr) {
67
                $path .= '/' . $name;
68
            }
69
            $aliases["@$name"] = $path;
70
        }
71
72
        return $aliases;
73
    }
74
75
    /**
76
     * Builds path inside of a package.
77
     *
78
     * @param Package $package
79
     * @param string $file
80
     * @return string absolute paths will stay untouched
81
     */
82
    private function preparePath(Package $package, string $file): string
83
    {
84
        if (0 === strncmp($file, '$', 1)) {
85
            return $file;
86
        }
87
88
        $skippable = 0 === strncmp($file, '?', 1) ? '?' : '';
89
        if ($skippable) {
90
            $file = substr($file, 1);
91
        }
92
93
        if (!$this->filesystem->isAbsolutePath($file)) {
94
            $prefix = $package->isRoot()
95
                ? $package->getBaseDir()
96
                : $package->getVendorDir() . '/' . $package->getPrettyName();
97
            $file = $prefix . '/' . $file;
98
        }
99
100
        return $skippable . $this->filesystem->normalizePath($file);
101
    }
102
}
103