Passed
Pull Request — master (#88)
by Dave
02:09
created

ProjectRoot::fromCurrentWorkingDirectory()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common;
6
7
use LogicException;
8
use Webmozart\Assert\Assert;
9
use Webmozart\PathUtil\Path;
10
11
/**
12
 * Holds the root directory for the project being analysed.
13
 *
14
 * It is recommended that all static analysis tools report the full path of the files they analyse.
15
 * The ResultsParses then use the getRelativePath method of the class and all file paths in the baseline are
16
 * stored as relative to the project root.
17
 *
18
 * NOTE: Assuming the GitHistoryAnalyser is being used then the root directory contains the .git directory.
19
 */
20
class ProjectRoot
21
{
22
    /**
23
     * @var string
24
     */
25
    private $rootDirectory;
26
27
    public static function fromCurrentWorkingDirectory(string $currentWorkingDirectory): self
28
    {
29
        Assert::true(Path::isAbsolute($currentWorkingDirectory));
30
        $rootDirectory = Path::canonicalize($currentWorkingDirectory);
31
32
        return new self($rootDirectory);
33
    }
34
35
    public static function fromProjectRoot(string $projectRoot, string $currentWorkingDirectory): self
36
    {
37
        if (Path::isAbsolute($projectRoot)) {
38
            $rootDirectory = Path::canonicalize($projectRoot);
39
        } else {
40
            $rootDirectory = Path::makeAbsolute($projectRoot, $currentWorkingDirectory);
41
        }
42
43
        return new self($rootDirectory);
44
    }
45
46
    private function __construct(string $rootDirectory)
47
    {
48
        $this->rootDirectory = $rootDirectory;
49
    }
50
51
    /**
52
     * Returns path relative to project root.
53
     *
54
     * @throws InvalidPathException
55
     */
56
    public function getPathRelativeToRootDirectory(AbsoluteFileName $absoluteFileName): RelativeFileName
57
    {
58
        $fullPath = $absoluteFileName->getFileName();
59
        if (!Path::isBasePath($this->rootDirectory, $fullPath)) {
60
            throw InvalidPathException::notInProjectRoot($fullPath, $this->rootDirectory);
61
        }
62
63
        $relativeFileName = Path::makeRelative($fullPath, $this->rootDirectory);
64
65
        return new RelativeFileName($relativeFileName);
66
    }
67
68
    public function __toString(): string
69
    {
70
        return $this->getProjectRootDirectory();
71
    }
72
73
    /**
74
     * @codeCoverageIgnore
75
     */
76
    public function getAbsoluteFileName(RelativeFileName $relativeFileName): AbsoluteFileName
77
    {
78
        $absoluteFileName = Path::join([$this->rootDirectory, $relativeFileName->getFileName()]);
79
80
        try {
81
            return new AbsoluteFileName($absoluteFileName);
82
        } catch (InvalidPathException $e) {
83
            throw new LogicException("Invalid $absoluteFileName");
84
        }
85
    }
86
87
    public function getProjectRootDirectory(): string
88
    {
89
        return $this->rootDirectory;
90
    }
91
}
92