Passed
Pull Request — master (#6)
by Dmitriy
58:09 queued 43:13
created

AliasesCollector::prepareAliases()   A

Complexity

Conditions 6
Paths 10

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

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