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

Folder::writeFile()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 13

Duplication

Lines 23
Ratio 100 %

Code Coverage

Tests 16
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 13
nc 2
nop 2
dl 23
loc 23
ccs 16
cts 16
cp 1
crap 2
rs 9.0856
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 9
    public function __construct($folderPath)
25
    {
26 9
        $this->fs = new Filesystem();
27 9
        $this->targetDirectories = array();
28
29
        // Setup the absolute path to the directory
30 9
        if (substr($folderPath, 0, 1) === DIRECTORY_SEPARATOR)
31 9
        {
32
            $this->absolutePath = $folderPath;
33
        }
34
        else
35
        {
36 9
            $this->absolutePath = $this->fs->absolutePath($folderPath);
37
        }
38
39
        // Ensure our directory paths will don't end with a '/'
40 9
        $this->absolutePath = rtrim($this->absolutePath, DIRECTORY_SEPARATOR);
41
42 9
        if (!$this->fs->isDir($this->absolutePath))
43 9
        {
44
            throw new \InvalidArgumentException();
45
        }
46
47 9
        if (!$this->fs->exists($this->absolutePath))
48 9
        {
49
            throw new FileNotFoundException();
50
        }
51 9
    }
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 9 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 9
        $outputFolder = $this->fs->getFolderPath($relativePath);
109 9
        $targetFileName = $this->fs->getFileName($outputFolder);
110
111 9
        $absoluteFolderPath = $this->buildPath($this->getCwd(), $outputFolder);
112
113 9
        if (!file_exists($absoluteFolderPath))
114 9
        {
115 6
            mkdir($absoluteFolderPath, 0755, true);
116 6
        }
117
118 9
        file_put_contents(
119 9
            $this->buildPath($this->getCwd(), $relativePath),
120
            $content
121 9
        );
122
123 9
        return (new SplFileInfo(
124 9
            $targetFileName,
125 9
            $absoluteFolderPath,
126 9
            $this->buildPath($absoluteFolderPath, $targetFileName)
127 9
        ));
128
    }
129
130
    /**
131
     * @param string $pathFragments
132
     *
133
     * @return string
134
     */
135 9
    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 9
        $paths = func_get_args();
138
139 9
        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 9
    private function getCwd()
148
    {
149 9
        $location = array_merge(array($this->absolutePath), $this->targetDirectories);
150
151 9
        return implode(DIRECTORY_SEPARATOR, $location);
152
    }
153
}
154