StdFilesystem   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 18
dl 0
loc 57
rs 10
c 0
b 0
f 0
wmc 13

8 Methods

Rating   Name   Duplication   Size   Complexity  
A writeFile() 0 3 1
A getAbsolutePath() 0 3 2
A __construct() 0 4 1
A readDir() 0 4 2
A mkdir() 0 3 1
A readFile() 0 9 2
A exists() 0 3 1
A isFile() 0 4 3
1
<?php
2
3
/**
4
 * This file is part of byrokrat\giroapp.
5
 *
6
 * byrokrat\giroapp is free software: you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License as published
8
 * by the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * byrokrat\giroapp is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with byrokrat\giroapp. If not, see <http://www.gnu.org/licenses/>.
18
 *
19
 * Copyright 2016-21 Hannes Forsgård
20
 */
21
22
declare(strict_types=1);
23
24
namespace byrokrat\giroapp\Filesystem;
25
26
use byrokrat\giroapp\Exception\UnableToReadFileException;
27
use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem;
28
use Symfony\Component\Finder\Finder;
29
30
final class StdFilesystem implements FilesystemInterface
31
{
32
    /** @var string */
33
    private $baseDir;
34
35
    /** @var SymfonyFilesystem */
36
    private $fs;
37
38
    public function __construct(string $baseDir, SymfonyFilesystem $fs)
39
    {
40
        $this->baseDir = $baseDir;
41
        $this->fs = $fs;
42
    }
43
44
    public function getAbsolutePath(string $path): string
45
    {
46
        return $this->fs->isAbsolutePath($path) ? $path : $this->baseDir . DIRECTORY_SEPARATOR . $path;
47
    }
48
49
    public function exists(string $path): bool
50
    {
51
        return $this->fs->exists($this->getAbsolutePath($path));
52
    }
53
54
    public function mkdir(string $path): void
55
    {
56
        $this->fs->mkdir($this->getAbsolutePath($path));
57
    }
58
59
    public function isFile(string $path): bool
60
    {
61
        $path = $this->getAbsolutePath($path);
62
        return $this->fs->exists($path) && is_file($path) && is_readable($path);
63
    }
64
65
    public function readFile(string $path): FileInterface
66
    {
67
        if (!$this->isFile($path)) {
68
            throw new UnableToReadFileException("Unable to read {$this->getAbsolutePath($path)}");
69
        }
70
71
        return new Sha256File(
72
            basename($path),
73
            (string)file_get_contents($this->getAbsolutePath($path))
74
        );
75
    }
76
77
    public function readDir(string $path): iterable
78
    {
79
        foreach ((new Finder())->in($this->getAbsolutePath($path))->files() as $fileInfo) {
80
            yield $fileInfo->getRealPath() => new Sha256File($fileInfo->getFilename(), $fileInfo->getContents());
81
        }
82
    }
83
84
    public function writeFile(FileInterface $file): void
85
    {
86
        $this->fs->dumpFile($this->getAbsolutePath($file->getFilename()), $file->getContent());
87
    }
88
}
89