Completed
Pull Request — master (#41)
by Vladimir
02:54
created

Folder::__construct()   B

Complexity

Conditions 4
Paths 6

Size

Total Lines 28
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 4.25

Importance

Changes 0
Metric Value
cc 4
eloc 12
nc 6
nop 1
dl 0
loc 28
ccs 12
cts 16
cp 0.75
crap 4.25
rs 8.5806
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @copyright 2017 Vladimir Jimenez
5
 * @license   https://github.com/allejo/stakx/blob/master/LICENSE.md MIT
6
 */
7
8
namespace allejo\stakx\System;
9
10
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
11
use Symfony\Component\Finder\SplFileInfo;
12
13
/**
14
 * All folder paths stored inside of this class will **not** have the ending DIRECTORY_SEPARATOR.
15
 *
16
 * @internal
17
 */
18
class Folder
19
{
20
    protected $fs;
21
    protected $absolutePath;
22
    protected $targetDirectories;
23
24 12
    public function __construct($folderPath)
25
    {
26 12
        $this->fs = new Filesystem();
27 12
        $this->targetDirectories = array();
28
29
        // Setup the absolute path to the directory
30 12
        if (substr($folderPath, 0, 1) === DIRECTORY_SEPARATOR)
31 12
        {
32
            $this->absolutePath = $folderPath;
33
        }
34
        else
35
        {
36 12
            $this->absolutePath = $this->fs->absolutePath($folderPath);
37
        }
38
39
        // Ensure our directory paths will don't end with a '/'
40 12
        $this->absolutePath = rtrim($this->absolutePath, DIRECTORY_SEPARATOR);
41
42 12
        if (!$this->fs->isDir($this->absolutePath))
43 12
        {
44
            throw new \InvalidArgumentException();
45
        }
46
47 12
        if (!$this->fs->exists($this->absolutePath))
48 12
        {
49
            throw new FileNotFoundException();
50
        }
51 12
    }
52
53
    public function __toString()
54
    {
55
        return rtrim($this->absolutePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
56
    }
57
58
    /**
59
     * Set a base folder that will be prefixed before all file writes and copies.
60
     *
61
     * @param string $folderName
62
     *
63
     * @since 0.1.0
64
     */
65
    public function setTargetDirectory($folderName)
66
    {
67
        if (is_null($folderName) || empty($folderName))
68
        {
69
            $this->targetDirectories = array();
70
        }
71
        else
72
        {
73
            $this->targetDirectories[] = trim($folderName, DIRECTORY_SEPARATOR);
74
        }
75
    }
76
77
    /**
78
     * Copy a file from an absolute file to a path relative to the Folder's location.
79
     *
80
     * @param string $absolutePath The absolute path of the file
81
     * @param string $targetPath   The relative file path to the Folder's location
82
     *
83
     * @since 0.1.0
84
     */
85
    public function copyFile($absolutePath, $targetPath)
86
    {
87
        $targetPath = ltrim($targetPath, DIRECTORY_SEPARATOR);
88
89
        $this->fs->copy(
90
            $absolutePath,
91
            $this->buildPath($this->getCwd(), $targetPath),
92
            true
93
        );
94
    }
95
96
    /**
97
     * Write a file with the specified content.
98
     *
99
     * @param string $relativePath The file path relative to this Folder's location
100
     * @param string $content      The content that will be written to the file
101
     *
102
     * @since 0.1.0
103
     *
104
     * @return SplFileInfo
105
     */
106 12 View Code Duplication
    public function writeFile($relativePath, $content)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
107
    {
108 12
        $outputFolder = $this->fs->getFolderPath($relativePath);
109 12
        $targetFileName = $this->fs->getFileName($outputFolder);
110
111 12
        $absoluteFolderPath = $this->buildPath($this->getCwd(), $outputFolder);
112
113 12
        if (!file_exists($absoluteFolderPath))
114 12
        {
115 9
            mkdir($absoluteFolderPath, 0755, true);
116 9
        }
117
118 12
        file_put_contents(
119 12
            $this->buildPath($this->getCwd(), $relativePath),
120
            $content
121 12
        );
122
123 12
        return (new SplFileInfo(
124 12
            $targetFileName,
125 12
            $absoluteFolderPath,
126 12
            $this->buildPath($absoluteFolderPath, $targetFileName)
127 12
        ));
128
    }
129
130
    /**
131
     * @param string $pathFragments
132
     *
133
     * @return string
134
     */
135 12
    private function buildPath($pathFragments)
0 ignored issues
show
Unused Code introduced by
The parameter $pathFragments is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
136
    {
137 12
        $paths = func_get_args();
138
139 12
        return implode(DIRECTORY_SEPARATOR, $paths);
140
    }
141
142
    /**
143
     * Returns the absolute path of where files will be placed.
144
     *
145
     * @return string
146
     */
147 12
    private function getCwd()
148
    {
149 12
        $location = array_merge(array($this->absolutePath), $this->targetDirectories);
150
151 12
        return implode(DIRECTORY_SEPARATOR, $location);
152
    }
153
}
154