Passed
Push — main ( 8e6204...a1c3a3 )
by James Ekow Abaka
10:05
created

FileCollection::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
1
<?php
2
3
4
namespace ntentan\utils\filesystem;
5
6
7
use ntentan\utils\Filesystem;
8
9
/**
10
 * Holds a collection of files.
11
 * This may be returned from directory contents or glob operations. A collection can contain regular files and 
12
 * directories and, its contents do not need to be from the same root directory.
13
 *
14
 * @package ntentan\utils\filesystem
15
 */
16
class FileCollection implements \Iterator, \ArrayAccess, FileInterface, \Countable
17
{
18
    /**
19
     * An array holding all paths in this collection
20
     * @var array
21
     */
22
    private $paths;
23
24
    /**
25
     * Current index of the iterator in the list of paths.
26
     * @var int
27
     */
28
    private $iteratorIndex;
29
30
    /**
31
     * A lightweight cache that holds instances of file objects created.
32
     * @var array<FileInterface>
33
     */
34
    private $instances;
35
36
    /**
37
     * FileCollection constructor.
38
     * @param $paths
39
     */
40 5
    public function __construct($paths)
41
    {
42 5
        $this->paths = $paths;
43 5
        $this->iteratorIndex = 0;
44 5
    }
45
46
    /**
47
     * Get an instance of a file object for a path in the collection.
48
     * This is used whenever an item must be returned from the collection.
49
     *
50
     * @param $index
51
     * @return mixed
52
     */
53 5
    private function getInstance($index)
54
    {
55 5
        if(!isset($this->instances[$index])) {
56 5
            if(is_dir($this->paths[$index])) {
57 5
                $this->instances[$index] = Filesystem::directory($this->paths[$index]);
58
            } else {
59 5
                $this->instances[$index] = Filesystem::file($this->paths[$index]);
60
            }
61
        }
62 5
        return $this->instances[$index];
63
    }
64
65 5
    public function rewind()
66
    {
67 5
        $this->iteratorIndex = 0;
68 5
    }
69
70 5
    public function current()
71
    {
72 5
        return $this->getInstance($this->iteratorIndex);
73
    }
74
75 1
    public function key()
76
    {
77 1
        return $this->iteratorIndex;
78
    }
79
80 5
    public function next()
81
    {
82 5
        $this->iteratorIndex++;
83 5
    }
84
85 5
    public function valid()
86
    {
87 5
        return isset($this->paths[$this->iteratorIndex]);
88
    }
89
90
    public function offsetSet($index, $path)
91
    {
92
        if(is_null($index)) {
93
            $this->paths[] = $path;
94
        } else {
95
            $this->paths[$index] = $path;
96
            unset($this->instances[$index]);
97
        }
98
    }
99
100
    public function offsetExists($index)
101
    {
102
        return isset($this->paths[$index]);
103
    }
104
105
    public function offsetGet($index)
106
    {
107
        return isset($this->paths[$index]) ? $this->paths[$index] : null;
108
    }
109
110
    public function offsetUnset($index)
111
    {
112
        unset($this->paths[$index]);
113
    }
114
115 1
    public function moveTo(string $destination, int $ovewrite = 0): void
116
    {
117 1
        foreach($this as $file) {
118 1
            $file->moveTo($destination . DIRECTORY_SEPARATOR . basename($file), $ovewrite);
0 ignored issues
show
Bug introduced by
$file of type ntentan\utils\filesystem\FileInterface is incompatible with the type string expected by parameter $path of basename(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

118
            $file->moveTo($destination . DIRECTORY_SEPARATOR . basename(/** @scrutinizer ignore-type */ $file), $ovewrite);
Loading history...
119
        }
120 1
    }
121
122 1
    public function copyTo(string $destination, int $ovewrite = 0): void
123
    {
124 1
        foreach($this as $file) {
125 1
            $file->copyTo($destination . DIRECTORY_SEPARATOR . basename($file), $ovewrite);
0 ignored issues
show
Bug introduced by
$file of type ntentan\utils\filesystem\FileInterface is incompatible with the type string expected by parameter $path of basename(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

125
            $file->copyTo($destination . DIRECTORY_SEPARATOR . basename(/** @scrutinizer ignore-type */ $file), $ovewrite);
Loading history...
126
        }
127 1
    }
128
129 1
    public function getSize(): int
130
    {
131 1
        return array_reduce(iterator_to_array($this),
132 1
            function($carry, $item){
133 1
                return $carry + $item->getSize();
134 1
            }, 0);
135
    }
136
137 2
    public function delete(): void
138
    {
139 2
        foreach($this as $file) {
140 1
            $file->delete();
141
        }
142 2
    }
143
144
    public function getPath(): string
145
    {
146
        return array_reduce($this->paths,
147
            function($carry, $path) {
148
                $carry .= escapeshellarg($path) . " ";
149
            }, "");
150
    }
151
152 1
    public function count()
153
    {
154 1
        return count($this->paths);
155
    }
156
157
    public function deleteIfExists(): void
158
    {
159
        $this->delete();
160
    }
161
}
162